c# - 使用 Fluent API 添加唯一标识符

标签 c# sql entity-framework-core fluent

我正在使用一个我无法控制的模型,我将其实例保存在 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; }

然而,完全有可能接收到两个具有相同 DocumentIdMessage。通常我会在使用 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 之类的东西保存时让 SQL 添加唯一标识符,但由于我无法控制 Message,如何我会处理这个吗?

非常感谢任何提示。

最佳答案

幸运的是,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 会更加困难。添加很容易,但是读取、更新和删除操作就会有问题。 EF.Property 方法可以在 LINQ 查询中使用以引用影子 PK,但通常您需要一些次要条件以防您想要更新或删除记录。

关于c# - 使用 Fluent API 添加唯一标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49799970/

相关文章:

c# - 用户控件在运行时动态创建,但存在内存泄漏

java - Hibernate 为每个查询生成不同的 SQL

php - 将 datetime 转换为 varchar 从 MSSQL 到 MYSQL

mysql - Sql 将多条记录合并为一条记录

c# - 如何在 EF Core 2 中为 .ThenInclude 编写 Repository 方法

c# - 在 Entity Framework 7 中创建自引用的多对多关系

c# - 有没有一种简单的方法可以验证数据库模式是否正是我期望它使用 Entity Framework 的方式?

c# - 如何在C#中查找char数组中的字符索引

c# - 将列表分配给列表框时,未将对象引用设置为对象实例异常

entity-framework-core - 使用 EFCore 使用私有(private)字段设置自定义外键列名称