entity framework自动生成GUID

我是EF的新手,所以这里。我有一个包含以下内容的类

public class EmailTemplate { public Guid Id { get; set; } [MaxLength(2000)] public string Html { get; set; } } 

这是我的映射类

 class EmailMapper : EntityTypeConfiguration { public EmailMapper() { ToTable("EmailTemplate"); HasKey(c => c.Id); Property(c => c.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); Property(c => c.Id).IsRequired(); } } 

我试图调用DbContext.SaveChanges() ,但我收到以下错误:

exception详细信息:System.Data.SqlClient.SqlException:无法将值NULL插入列’Id’,表’AutoSendConnection.dbo.EmailTemplates’; 列不允许空值。 INSERT失败。

我究竟做错了什么? 为什么EF auto不会创建一个独特的GUID?

只需在EmailTemplate类上装饰Id字段,如下所示,SQL Server将自动生成插入值。

 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [Key] public Guid Id { get; set; } 

您也可以删除不再需要的Mapper类。

使用流畅的API

 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity().Property(x => x.ID).HasDefaultValueSql("NEWID()"); } 

在映射配置中将字段的默认sql值设置为“newsequentialid()”。

您还可以在Sql Server本身中将ID的默认值设置为NewID(),并将GUID作为null传递

我以前在SSMS中这样做。

我更喜欢让数据库自动生成id,例如以下模式:

 CREATE TABLE [dbo].[MyTable]( [MyId] [uniqueidentifier] NOT NULL CONSTRAINT [DF_Booking_BookingId] DEFAULT (newsequentialid()) ) 

然后在代码第一个映射中,我指定以下内容告诉Entity Framework数据库将负责在insert上生成值。

 Property(a => a.MyId).IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

entity framework核心更新

无需使用[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
没有必要使用fluent API

EF Core会自动处理它并为主键生成Id

例:

 public class DummyEntity { public Guid Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } 

播种

  _context.DummyEntities.Add(new DummyEntity { FirstName = "Abc", LastName = "Def", Postion = "User", }); _context.SaveChanges();