使用Fluent API添加唯一标识符

时间:2018-04-12 15:05:15

标签: c# sql entity-framework-core fluent

我正在使用一个我无法控制的模型,我将其保存在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,我该如何处理?

任何提示都非常赞赏。

1 个答案:

答案 0 :(得分:3)

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

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

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

modelBuilder.Entity<Message>()
    .HasKey("Id");
在这种情况下,

ValueGeneratedOnAddHasKey是多余的,因为按惯例命名为“Id”的属性是PK,并且按惯例生成的int类型PK是自动生成的,但我已添加它们为了完整。

但请注意,使用影子PK会更难。添加很简单,但读取,更新和删除操作将会出现问题。可以在LINQ查询中使用EF.Property方法来引用影子PK,但一般情况下,如果要更新或删除记录,则需要一些辅助条件。