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();