如何将两个不相关的外键关联回同一实体 [英] How to relate two unrelated foreign keys back to the same entity
问题描述
首先使用EF代码,我在由 Packages
和 Services
上创建了复合主键> Id 和 Member_Id
。
Using EF code first, I created compound primary key on Packages
and Services
consisting of Id
and Member_Id
.
然后我从这两个表中都创建了外键进入承诺
。
Then I made foreign keys from both of those tables into Promises
.
您可以看到它没有t将两个外键关联回相同的成员
,从而允许 package
成员不同于 service
成员。这不是我想要的。
As you can see it didn't relate the two foreign keys back to the same Member
thus allowing the package
member to be different than the service
member. This is not what I intended.
我打算有承诺
仅有一个 Member_Id
列,并在两个外键中重复使用。用问题的术语来说,我打算让承诺
仅具有成员$的
服务
拥有承诺
的包
的c $ c>。
I intend to have Promises
just have a single Member_Id
column and reuse it in both foreign keys. In problem terms, I intend for promises
to only have services
of the member
that owns that promise
's package
.
我可以轻松地在数据库中执行此操作。请参阅此固定图:
I can easily do this in the database. See this fixed diagram:
此功能从 Promise
返回到 Package
和 Services
的复合外键。
This features compound foreign keys from Promises
back to Packages
and Services
.
我如何在EF中分配我的类以实现此结果?
How can I attribute my classes in EF to achieve this result?
我是数据库优先的唯一选择迁移并检查并模仿它在数据库图编辑器中手动执行的操作?
Is my only option to Database First migration and check and see what it does to mimic what I did manually in the database diagram editor?
推荐答案
我必须:
- 以所需的方式修复数据库
- 创建一个新的Class Libray项目
- 添加实体框架模型。从现有数据库中选择代码优先
- 查看我的类和从数据库优先生成的类之间的区别,并查看需要将哪些应用于我的模型。在这种情况下,我发现创建所需外键的唯一方法是使用代码而不是属性,而这是在模型中的
OnModelCreating
例程中完成的(DbContext
)类:
- Fix my database the way I wanted it
- Create a new Class Libray Project
- Add Entity Framework Model. Choose Code First from Existing Database
- Look at the differences between my classes and the generated classes from Database First, and see which ones I need to apply to my model. In this case, I found that the only way to create the foreign keys I wanted was with code not attributes and this is done in the
OnModelCreating
routine in the model (DbContext
) class:
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);
}
这篇关于如何将两个不相关的外键关联回同一实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!