admin

使用Fluent API添加唯一标识符

sql

我正在使用无法控制的模型,该模型将实例保存在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。通常,在使用诸如进行保存时,我会要求SQL添加一个唯一标识符[DatabaseGenerated(DatabaseGeneratedOption.Identity)],但是由于我没有控制权Message,我将如何处理呢?

任何提示,不胜感激。


阅读 200

收藏
2021-07-01

共1个答案

admin

幸运的是,EF Core允许您定义和使用Shadow属性作为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,但是通常,如果您想更新或删除一条记录,则需要一些辅助条件。

2021-07-01