ASP.NET Core EF模型配置:排除字段/设置主键/默认值生成

GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!
如果你想靠AI翻身,你先需要一个靠谱的工具!

1.什么是Fluent API?

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

2.包含属性和排除属性

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

2.1包含属性

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

1
2
3
4
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.Entity<Blog>();
}

2.2排除属性

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

2.2.1数据批注

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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数据批注

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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() 的默认值以生成新行的值,然后即可使用数据库触发器在更新过程中生成值,如下面的示例触发器所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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无值生成

1
2
3
4
5
6
public class Blog
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int BlogId { get; set; }
    public string Url { get; set; }
}

4.1.2在添加时生成值

1
2
3
4
5
6
7
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime Inserted { get; set; }
}

4.1.3在添加或更新时生成值

1
2
3
4
5
6
7
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无值生成

1
2
3
modelBuilder.Entity<Blog>()
    .Property(b => b.BlogId)
    .ValueGeneratedNever();

4.2.2在添加时生成值

1
2
3
modelBuilder.Entity<Blog>()
    .Property(b => b.Inserted)
.ValueGeneratedOnAdd();

4.2.3在添加或更新时生成值

1
2
3
modelBuilder.Entity<Blog>()
    .Property(b => b.LastUpdated)
    .ValueGeneratedOnAddOrUpdate();

到此这篇关于ASP.NET Core使用EF创建模型的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空