使用 Fluent API 添加唯一标识符

Adding unique identifier with Fluent API

我正在使用一个我无法控制的模型,我将其实例保存在 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; }

然而,完全有可能收到两个具有相同 DocumentIdMessage。通常我会在使用 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 之类的东西保存时让 SQL 添加一个唯一标识符,但由于我无法控制 Message,我该如何处理呢?

非常感谢任何提示。

幸运的是,EF Core 允许您定义和使用 Shadow property 作为 PK。

例如,以下流畅的配置将创建名为 "Id" 的标识列并将其用作主键:

modelBuilder.Entity<Message>()
    .Property<int>("Id")
    .ValueGeneratedOnAdd();

modelBuilder.Entity<Message>()
    .HasKey("Id");

ValueGeneratedOnAddHasKey 在这种情况下是多余的,因为 属性 按照惯例命名为 "Id" 是 PK,而 int 类型的 PK 按照惯例是自动的已生成,但为了完整性我添加了它们。

不过请注意,使用影子PK会比较困难。添加很容易,但是读取、更新和删除操作就会有问题。 EF.Property 方法可以在 LINQ 查询中使用以引用影子 PK,但通常您需要一些次要条件以防您想要更新或删除记录。