如何将两个不相关的外键关联回同一个实体
How to relate two unrelated foreign keys back to the same entity
首先使用 EF 代码,我在 Packages
和 Services
上创建了由 Id
和 Member_Id
组成的复合主键。
然后我将这两个表的外键都变成了 Promises
。
如您所见,它没有将两个外键关联回同一个 Member
,因此允许 package
成员与 service
成员不同。这不是我想要的。
我打算 Promises
只有一个 Member_Id
列并在两个外键中重复使用它。在问题方面,我打算让 promises
只有 member
的 services
拥有 promise
的 package
。
我可以在数据库中轻松做到这一点。看这张固定图:
这具有从 Promises
回到 Packages
和 Services
.
的复合外键
如何在 EF 中归因于我的 类 以获得此结果?
我唯一的选择是数据库优先迁移并检查它模仿我在数据库图表编辑器中手动执行的操作吗?
我不得不:
- 按照我想要的方式修复我的数据库
- 创建一个新的 Class Libray 项目
- 添加Entity Framework 型号。从现有数据库中选择代码优先
- 查看我的 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);
}
首先使用 EF 代码,我在 Packages
和 Services
上创建了由 Id
和 Member_Id
组成的复合主键。
然后我将这两个表的外键都变成了 Promises
。
如您所见,它没有将两个外键关联回同一个 Member
,因此允许 package
成员与 service
成员不同。这不是我想要的。
我打算 Promises
只有一个 Member_Id
列并在两个外键中重复使用它。在问题方面,我打算让 promises
只有 member
的 services
拥有 promise
的 package
。
我可以在数据库中轻松做到这一点。看这张固定图:
这具有从 Promises
回到 Packages
和 Services
.
如何在 EF 中归因于我的 类 以获得此结果?
我唯一的选择是数据库优先迁移并检查它模仿我在数据库图表编辑器中手动执行的操作吗?
我不得不:
- 按照我想要的方式修复我的数据库
- 创建一个新的 Class Libray 项目
- 添加Entity Framework 型号。从现有数据库中选择代码优先
- 查看我的 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);
}