我正在使用一个我无法控制的模型,我将其实例保存在 SQL 数据库中。
我正在使用 Fluent API 将主键添加到此模型中的属性
modelBuilder.Entity<Message>().HasKey(d => d.DocumentId);
消息
如下所示:
[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”的标识列并将其用作 PK:
modelBuilder.Entity<Message>()
.Property<int>("Id")
.ValueGeneratedOnAdd();
modelBuilder.Entity<Message>()
.HasKey("Id");
ValueGeneratedOnAdd
和 HasKey
在这种情况下是多余的,因为按照惯例命名为“Id”的属性是 PK,而 int
类型的 PK 按照惯例是自动生成,但为了完整性我添加了它们。
但请注意,使用影子 PK 会更加困难。添加很容易,但是读取、更新和删除操作就会有问题。 EF.Property
方法可以在 LINQ 查询中使用以引用影子 PK,但通常您需要一些次要条件以防您想要更新或删除记录。
关于c# - 使用 Fluent API 添加唯一标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49799970/