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

时间:2016-05-16 22:55:29

标签: entity-framework-5

首先使用EF代码,我在Packages创建了复合主键,Services创建了IdMember_Id

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

data model (wrong)

正如您所看到的,它没有将两个外键关联回同一Member,从而允许package成员与service成员不同。这不是我的意图。

我打算让Promises只有一个Member_Id列,并在两个外键中重复使用它。在问题方面,我打算promises仅拥有拥有services member的{​​{1}} promise

我可以在数据库中轻松完成此操作。请参见此固定图表:

data model (fixed)

这允许将package的复合外键复制回PromisesPackages

如何在EF中将我的类归因于实现此结果?

我是Database First迁移的唯一选择,并查看它是如何模仿我在数据库图表编辑器中手动完成的操作的?

1 个答案:

答案 0 :(得分:0)

我必须:

  1. 按照我想要的方式修复我的数据库
  2. 创建新的类库项目
  3. 添加实体框架模型。从现有数据库中选择Code First
  4. 查看我的类与Database First中生成的类之间的差异,看看我需要将哪些类应用于我的模型。在这种情况下,我发现创建我想要的外键的唯一方法是使用代码而不是属性,这是在模型(OnModelCreating)类中的DbContext例程中完成的:
  5.     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);
        }
    
相关问题