ASP.NET Core使用EF创建模型(包含属性、排除属性、主键和生成值)
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();
到此这篇关于ASP.NET Core使用EF创建模型的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
手把手教你AspNetCore WebApi认证与授权的方法
这篇文章主要介绍了手把手教你AspNetCore WebApi认证与授权的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-10-10Visual Studio(VS2017)配置C/C++ PostgreSQL9.6.3开发环境
这篇文章主要为大家详细介绍了Visual Studio(VS2017)配置C/C++,PostgreSQL9.6.3开发环境,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-07-07ASP.NET服务器端控件RadioButtonList,DropDownList,CheckBoxList的取值、赋值
这三个控件都有一个Items集合,可以用 RepeatLayout 和 RepeatDirection 属性来控制列表的呈现形式2013-10-10ASP.Net2.0 GridView 多列排序,显示排序图标,分页
ASP.Net2.0 GridView 多列排序,显示排序图标,分页...2006-09-09
最新评论