我正在使用一个我无法控制的模型,我将其实例保存在 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
,我将如何处理?
任何提示都非常感谢。
幸运的是,EF Core 允许您定义和使用Shadow 属性作为 PK。
例如,以下 fluent 配置将创建名为“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,但通常您需要一些次要条件,以防您想要更新或删除记录。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句