欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

(19)ASP.NET Core EF创建模型(包含属性和排除属性、主键、生成的值)

程序员文章站 2022-04-18 11:49:01
1.什么是Fluent API? EF中内嵌的约定将POCO类映射到表。但是,有时您无法或不想遵守这些约定,需要将实体映射到约定指示外的其他对象,所以Fluent API和注解都是一种方法,这两种方法是用来配置EF在映射属性时绕开约定。Code first fluent API最常访问通过重写OnM ......

1.什么是fluent api?

ef中内嵌的约定将poco类映射到表。但是,有时您无法或不想遵守这些约定,需要将实体映射到约定指示外的其他对象,所以fluent api和注解都是一种方法,这两种方法是用来配置ef在映射属性时绕开约定。code first fluent api最常访问通过重写onmodelcreating方法在派生dbcontext。

2.包含属性和排除属性

按照约定,数据模型中都包含一个getter和一个setter公共属性。

2.1包含属性

包含属性官网解释有点难以理解,我个人认为在onmodelcreating方法配置包含blog模型,那么当我们调用blog模型读写数据时候就会从连接数据库中读写对应blog表。

protected override void onmodelcreating(modelbuilder modelbuilder)
{
  modelbuilder.entity<blog>();
}

2.2排除属性

如果你不想往blogmetadata上读写数据,可以使用数据批注或者fluent api从模型中排除该实体类型。

2.2.1数据批注
namespace efmodeling.dataannotations.ignoretype
{
    class mycontext : dbcontext
    {
        public dbset<blog> blogs { get; set; }
    }
    public class blog
    {
        public int blogid { get; set; }
        public string url { get; set; }
        public blogmetadata metadata { get; set; }
}
 //读写不映射该实体
    [notmapped]
    public class blogmetadata
    {
        public datetime loadedfromdatabase { get; set; }
    }
}
2.2.2fluent api
namespace efmodeling.fluentapi.ignoretype
{
    class mycontext : dbcontext
    {
        public dbset<blog> blogs { get; set; }
        protected override void onmodelcreating(modelbuilder modelbuilder)
        {
             //ignore方法就是读写不映射该实体
        modelbuilder.ignore<blogmetadata>();
        }
    }
    public class blog
    {
        public int blogid { get; set; }
        public string url { get; set; }
        public blogmetadata metadata { get; set; }
    }
    public class blogmetadata
    {
        public datetime loadedfromdatabase { get; set; }
    }
}

3.主键

使用关系型数据库时候,都会涉及到主键概念,用作每个实体实例的主要唯一标识符。

3.1数据批注

namespace efmodeling.dataannotations.keysingle
{
    class mycontext : dbcontext
    {
        public dbset<car> cars { get; set; }
    }
    class car
    {
       //设置licenseplate为主键
        [key]
        public string licenseplate { get; set; }
        public string make { get; set; }
        public string model { get; set; }
    }
}

3.2fluent api

namespace efmodeling.fluentapi.keysingle
{
    class mycontext : dbcontext
    {
        public dbset<car> cars { get; set; }
        protected override void onmodelcreating(modelbuilder modelbuilder)
        {
            modelbuilder.entity<car>()
          //设置licenseplate为主键
                .haskey(c => c.licenseplate);
        }
    }
    class car
    {
        public string licenseplate { get; set; }
        public string make { get; set; }
        public string model { get; set; }
    }
}

4.生成值

有三个可用于属性的值生成模式:
●无值生成:没有值生成意味着,需始终提供要保存到数据库的有效值。必须先将有效的值赋予新的实体,再将这些新的实体添加到上下文中。
●在添加时生成值:在添加时生成值,意思是为新实体生成值。
●在添加或更新时生成值:在添加或更新时生成值,意味着在每次保存该记录(插入或更新)时生成新值。
注:如果想在数据库端添加或更新时自动生成值,我们可以通过触发器和配置默认值等方法生成。例如,如果指定在添加或更新时要生成datetime属性,则必须设置生成值的方法。若要执行此操作,一种方法是配置getdate() 的默认值以生成新行的值,然后即可使用数据库触发器在更新过程中生成值,如下面的示例触发器所示:

use [blogging]
go
/****** object:  trigger [dbo].[blog_update_trigger]    script date: 2019/10/22 16:18:13 ******/
set ansi_nulls on
go
set quoted_identifier on
go
alter trigger [dbo].[blog_update_trigger] on [dbo].[blog]
    after update
as
begin
    set nocount on;         
    if ((select trigger_nestlevel()) > 1) return;
declare @id int

    select @id = inserted.blogid
    from inserted
          
    update dbo.blog
    set updatetime = getdate()
    where blogid = @id
end

4.1数据批注

4.1.1无值生成
public class blog
{
    [databasegenerated(databasegeneratedoption.none)]
    public int blogid { get; set; }
    public string url { get; set; }
}
4.1.2在添加时生成值
public class blog
{
    public int blogid { get; set; }
    public string url { get; set; }
    [databasegenerated(databasegeneratedoption.identity)]
    public datetime inserted { get; set; }
}
4.1.3在添加或更新时生成值
public class blog
{
    public int blogid { get; set; }
    public string url { get; set; }
    [databasegenerated(databasegeneratedoption.computed)]
    public datetime lastupdated { get; set; }
}

4.2fluent api

4.2.1无值生成
modelbuilder.entity<blog>()
    .property(b => b.blogid)
    .valuegeneratednever();
4.2.2在添加时生成值
modelbuilder.entity<blog>()
    .property(b => b.inserted)
.valuegeneratedonadd();
4.2.3在添加或更新时生成值
modelbuilder.entity<blog>()
    .property(b => b.lastupdated)
    .valuegeneratedonaddorupdate();


参考文献: