如何将两个不相关的外键关联回同一实体 [英] How to relate two unrelated foreign keys back to the same entity

查看:115
本文介绍了如何将两个不相关的外键关联回同一实体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先使用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?

推荐答案

我必须:


  1. 以所需的方式修复数据库

  2. 创建一个新的Class Libray项目

  3. 添加实体框架模型。从现有数据库中选择代码优先

  4. 查看我的类和从数据库优先生成的类之间的区别,并查看需要将哪些应用于我的模型。在这种情况下,我发现创建所需外键的唯一方法是使用代码而不是属性,而这是在模型中的 OnModelCreating 例程中完成的( DbContext )类:

  1. Fix my database the way I wanted it
  2. Create a new Class Libray Project
  3. Add Entity Framework Model. Choose Code First from Existing Database
  4. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆