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