我正在使用无法控制的模型,该模型将实例保存在SQL数据库中。
我正在使用Fluent API在此模型中向属性添加主键
modelBuilder.Entity<Message>().HasKey(d => d.DocumentId);
Message 看起来像这样:
Message
[Required] public Guid DocumentId { get; set; } [Required] public int Size { get; set; } public string SenderId { get; set; }
但是,完全有可能接收到两个Message相同的DocumentId。通常,在使用诸如进行保存时,我会要求SQL添加一个唯一标识符[DatabaseGenerated(DatabaseGeneratedOption.Identity)],但是由于我没有控制权Message,我将如何处理呢?
DocumentId
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
任何提示,不胜感激。
幸运的是,EF Core允许您定义和使用Shadow属性作为PK。
例如,以下流利的配置将创建名为“ Id”的标识列,并将其用作PK:
modelBuilder.Entity<Message>() .Property<int>("Id") .ValueGeneratedOnAdd(); modelBuilder.Entity<Message>() .HasKey("Id");
ValueGeneratedOnAdd并且HasKey在这种情况下是多余的,因为习惯上名为“ Id”的属性是PK,int习惯上类型PK是自动生成的,但是为了完整起见,我添加了它们。
ValueGeneratedOnAdd
HasKey
int
但是请注意,使用影子PK会更加困难。添加很容易,但是读取,更新和删除操作会出现问题。EF.Property可以在LINQ查询中使用该方法来引用影子PK,但是通常,如果您想更新或删除一条记录,则需要一些辅助条件。
EF.Property