当前位置 : 主页 > 网络编程 > ASP >

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

来源:互联网 收集:自由互联 发布时间:2023-01-30
目录 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在添加时生成值
目录
  • 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。

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

      网友评论