首页 > 解决方案 > 如何在实体框架 6 中的多个访问器属性上创建复合主键

问题描述

我正在尝试基于 Entity Framework 6 中的三个导航属性创建一个复合键:ManufacturingBundle_Id、Part_Id 和 Process_Id

这是我目前使用的 PartProcess 类,其中 Id 是主键:

public class PartProcess
{
    public int Id { get; set; }
    public virtual ManufacturingBundle ManufacturingBundle { get; set; }
    public virtual Part Part { get; set; }
    public virtual Process Process { get; set; }
}

目前,我得到了自动生成的数据库表,其中包含以下列: Id | ManufacturingBundle_Id | Part_Id | Process_Id

其中 Id 是主键。我想摆脱 Id 列并根据 ManufacturingBundle_Id、Part_Id 和 Process_Id 创建一个复合主键

所以我尝试重载 OnModelCreating 方法,但这似乎不适用于类型化对象,调试器说属性需要是整数。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
      // create a composite primary key for PartProcess https://www.learnentityframeworkcore.com/configuration/fluent-api/haskey-method
      modelBuilder.Entity<PartProcess>()
                .HasKey(o => new { o.ManufacturingBundle, o.Part, o.Process });

      base.OnModelCreating(modelBuilder);
}

由于我使用导航属性并且 ManufacturingBundle_Id、Part_Id 和 Process_Id 属性由实体框架自动生成,我必须如何声明此复合主键?

谢谢你的帮助,

埃菲

标签: entity-framework-6keyprimary-keycomposite

解决方案


例如,假设 ManufacturingBundle 有一个 ManufacturingBundleId 字段,您需要按如下方式配置您的模型:

public class PartProcess
{
    public int ManufacturingBundleId { get; set; }
    public virtual ManufacturingBundle ManufacturingBundle { get; set; }

    public int PartId { get; set; }
    public virtual Part Part { get; set; }

    public int ProcessId { get; set; }
    public virtual Process Process { get; set; }
}

然后它应该让您在模型创建时创建复合键,如上所述。


推荐阅读