如何将两个不相关的外键关联回同一个实体

How to relate two unrelated foreign keys back to the same entity

首先使用 EF 代码,我在 PackagesServices 上创建了由 IdMember_Id 组成的复合主键。

然后我将这两个表的外键都变成了 Promises

如您所见,它没有将两个外键关联回同一个 Member,因此允许 package 成员与 service 成员不同。这不是我想要的。

我打算 Promises 只有一个 Member_Id 列并在两个外键中重复使用它。在问题方面,我打算让 promises 只有 memberservices 拥有 promisepackage

我可以在数据库中轻松做到这一点。看这张固定图:

这具有从 Promises 回到 PackagesServices.

的复合外键

如何在 EF 中归因于我的 类 以获得此结果?

我唯一的选择是数据库优先迁移并检查它模仿我在数据库图表编辑器中手动执行的操作吗?

我不得不:

  1. 按照我想要的方式修复我的数据库
  2. 创建一个新的 Class Libray 项目
  3. 添加Entity Framework 型号。从现有数据库中选择代码优先
  4. 查看我的 classes 与 Database First 生成的 classes 之间的区别,看看我需要将哪些应用到我的模型中。在这种情况下,我发现创建我想要的外键的唯一方法是使用代码而不是属性,这是在模型 (DbContext) class 的 OnModelCreating 例程中完成的:
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
      modelBuilder.Entity<Member>()
          .HasMany(e => e.Packages)
          .WithRequired(e => e.Member)
          .HasForeignKey(e => e.Member_Id);

      modelBuilder.Entity<Member>()
          .HasMany(e => e.Products)
          .WithRequired(e => e.Member)
          .HasForeignKey(e => e.Member_Id);

      modelBuilder.Entity<Member>()
          .HasMany(e => e.Services)
          .WithRequired(e => e.Member)
          .HasForeignKey(e => e.Member_Id);

      modelBuilder.Entity<Package>()
        .HasMany(e => e.Promises)
        .WithRequired(e => e.Package)
        .HasForeignKey(e => new { e.Package_Id, e.Member_Id })
        .WillCascadeOnDelete(false);

      modelBuilder.Entity<Service>()
        .HasMany(e => e.Promises)
        .WithRequired(e => e.Service)
        .HasForeignKey(e => new { e.Service_Id, e.Member_Id })
        .WillCascadeOnDelete(false);
    }