2016-05-16 86 views
0

首先使用EF代码,我在PackagesServices上创建了由IdMember_Id组成的复合主键。如何将两个不相关的外键关联回同一个实体

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

data model (wrong)

正如你可以看到它并不涉及两个外键回到同一Member从而使package成员比service成员不同。这不是我想要的。

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

我可以很容易地在数据库中做到这一点。看到这个固定图:

data model (fixed)

这从Promises功能复合外键回到PackagesServices

我怎样才能在EF中归类我的类来实现这个结果?

是我唯一的选择Database First迁移和检查,看看它做什么来模仿我在数据库图编辑器中手动执行的操作?

回答

0

我只好:

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