使用 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; }
然而,完全有可能收到两个具有相同 DocumentId
的 Message
。通常我会在使用 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
之类的东西保存时让 SQL 添加一个唯一标识符,但由于我无法控制 Message
,我该如何处理呢?
非常感谢任何提示。
幸运的是,EF Core 允许您定义和使用 Shadow property 作为 PK。
例如,以下流畅的配置将创建名为 "Id" 的标识列并将其用作主键:
modelBuilder.Entity<Message>()
.Property<int>("Id")
.ValueGeneratedOnAdd();
modelBuilder.Entity<Message>()
.HasKey("Id");
ValueGeneratedOnAdd
和 HasKey
在这种情况下是多余的,因为 属性 按照惯例命名为 "Id" 是 PK,而 int
类型的 PK 按照惯例是自动的已生成,但为了完整性我添加了它们。
不过请注意,使用影子PK会比较困难。添加很容易,但是读取、更新和删除操作就会有问题。 EF.Property
方法可以在 LINQ 查询中使用以引用影子 PK,但通常您需要一些次要条件以防您想要更新或删除记录。
我正在使用一个我无法控制的模型,我将其实例保存在 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; }
然而,完全有可能收到两个具有相同 DocumentId
的 Message
。通常我会在使用 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
之类的东西保存时让 SQL 添加一个唯一标识符,但由于我无法控制 Message
,我该如何处理呢?
非常感谢任何提示。
幸运的是,EF Core 允许您定义和使用 Shadow property 作为 PK。
例如,以下流畅的配置将创建名为 "Id" 的标识列并将其用作主键:
modelBuilder.Entity<Message>()
.Property<int>("Id")
.ValueGeneratedOnAdd();
modelBuilder.Entity<Message>()
.HasKey("Id");
ValueGeneratedOnAdd
和 HasKey
在这种情况下是多余的,因为 属性 按照惯例命名为 "Id" 是 PK,而 int
类型的 PK 按照惯例是自动的已生成,但为了完整性我添加了它们。
不过请注意,使用影子PK会比较困难。添加很容易,但是读取、更新和删除操作就会有问题。 EF.Property
方法可以在 LINQ 查询中使用以引用影子 PK,但通常您需要一些次要条件以防您想要更新或删除记录。