如何利用ASP.NET Core和EF在模型设计中设置属性、排除属性、定义主键及自动生成值?

2026-03-30 10:111阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1285个文字,预计阅读时间需要6分钟。

如何利用ASP.NET Core和EF在模型设计中设置属性、排除属性、定义主键及自动生成值?

目录

1.什么是Fluent API?

2.包含属性和排除属性

2.1 包含属性 2.2 排除属性 2.2.1 数据批量注解 2.2.2 Fluent API

3.主键

3.1 数据批量注解 3.2 Fluent API

4.生成值

4.1 数据批量注解 4.1.1 空值生成 4.1.2 添加时生成值

目录
  • 1.什么是Fluent API?
  • 2.包含属性和排除属性
    • 2.1包含属性
    • 2.2排除属性
      • 2.2.1数据批注
      • 2.2.2Fluent API
  • 3.主键
    • 3.1数据批注
      • 3.2Fluent API
      • 4.生成值
        • 4.1数据批注
          • 4.1.1无值生成
          • 4.1.2在添加时生成值
          • 4.1.3在添加或更新时生成值
        • 4.2Fluent API
          • 4.2.1无值生成
          • 4.2.2在添加时生成值
          • 4.2.3在添加或更新时生成值

      1.什么是Fluent API?

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

      如何利用ASP.NET Core和EF在模型设计中设置属性、排除属性、定义主键及自动生成值?

      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创建模型的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持自由互联。

      本文共计1285个文字,预计阅读时间需要6分钟。

      如何利用ASP.NET Core和EF在模型设计中设置属性、排除属性、定义主键及自动生成值?

      目录

      1.什么是Fluent API?

      2.包含属性和排除属性

      2.1 包含属性 2.2 排除属性 2.2.1 数据批量注解 2.2.2 Fluent API

      3.主键

      3.1 数据批量注解 3.2 Fluent API

      4.生成值

      4.1 数据批量注解 4.1.1 空值生成 4.1.2 添加时生成值

      目录
      • 1.什么是Fluent API?
      • 2.包含属性和排除属性
        • 2.1包含属性
        • 2.2排除属性
          • 2.2.1数据批注
          • 2.2.2Fluent API
      • 3.主键
        • 3.1数据批注
          • 3.2Fluent API
          • 4.生成值
            • 4.1数据批注
              • 4.1.1无值生成
              • 4.1.2在添加时生成值
              • 4.1.3在添加或更新时生成值
            • 4.2Fluent API
              • 4.2.1无值生成
              • 4.2.2在添加时生成值
              • 4.2.3在添加或更新时生成值

          1.什么是Fluent API?

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

          如何利用ASP.NET Core和EF在模型设计中设置属性、排除属性、定义主键及自动生成值?

          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创建模型的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持自由互联。