【问题标题】:How can I use SQL many-to-many table from Entity Framework?如何使用 Entity Framework 中的 SQL 多对多表?
【发布时间】:2013-03-12 02:07:20
【问题描述】:

我正在为一个现有应用程序进行开发,该应用程序使用一个由两个应用程序使用的 SQL 数据库。一种是使用实体框架连接到数据库。另一个使用 LINQ-to-SQL。 SQL 数据库被设计成有一些表显示两个表中的行之间的多对多关系。 Entity Framework 似乎没有导入这些表,显然是因为它有一些面向对象的想法来表示应该表示多少关系。到目前为止,Entity Framework 应用程序不需要知道这些表,但现在它应该知道。我不知道它是如何工作的,而且我担心即使我了解了 Entity Framework 令人兴奋的表示这些关系的新方法,它也不会与其他应用程序或旨在使用许多对多表。

即,有一个 Foos 表和一个 Bars 表,然后是一个包含 Foo 和 Bar Ids 的表,其中列出了哪些 Foos 与哪些 Bars 相关,我不想停止使用这个关系表,特别是因为有另一个 LINQ 应用程序大量使用此关系表。

问题:

如果我学会使用 Entity Framework 的多对多系统,它会使用和更新其他应用程序使用的多对多表吗?

如果没有,有什么好方法可以让实体框架不忽略多对多关系表,这样我就可以编写代码来使用现有的表?

【问题讨论】:

  • 什么版本的实体框架?
  • 实体框架 v4.0.30319。

标签: entity-framework linq-to-sql many-to-many


【解决方案1】:

是的,Entity Framework 将为您管理多对多表。 EF 中的纯链接表(只有两个外键列)表示为关系,而不是 POCO 对象。这样做的方式是您告诉 EF 您的两个对象之间存在关系,并且表 X 是存储该关系的位置。作为 EF 4.1 中的示例。这就是我目前正在使用的这样做:

modelBuilder.Entity<Foo>() //Let me tell you about Foo...
            .HasMany(f => f.Bars)  //The property in the Foo class that links to Bar objects is Bars
            .WithMany(b => b.Foos)  //The property in the Bar class that links to Foo objects is Foos
            .Map(m => {
                m.MapLeftKey("FooID"); //Name of the foreign key column in the link table for Foo
                m.MapRightKey("BarID"); //Name of the foreign key column in the link table for Bar
                m.ToTable("FooBar"); //Name of the link table
            });

然后,您可以通过链接/取消链接代码中的对象来更改此表。你几乎做了类似的事情

myFoo.Bars.Add(myBar); //Add a row to the link table
myFoo.Bars.Remove(myBar) //Delete a row from the link table

要获得完整的实施,您应该搜索您的 EF 版本。

如果链接表包含额外的列(例如创建日期),它们就像所有其他表一样由 POCO 表示。如果您真的对 EF 管理链接表的能力感到偏执,您可以通过在纯链接表中添加唯一 id 列来强制它走这条路,但我绝对不建议这样做。

这样想:EF 已经存在了一段时间,并且已经达到了一定的成熟度。将此与多对多关系在数据库中并不罕见的事实相结合。你真的认为 EF 的设计者没有处理过你的案子吗?

【讨论】:

  • 谢谢马诺斯!现在我需要复习一下在代码中调用 modelBuilder,而不是让 VS 向导自动神奇地基于数据库创建对象模型。 (也就是说,您的代码示例看起来很棒,但我需要弄清楚将其放在哪里以及将来更新数据库需要哪些步骤,因为过去它已经使用向导进行了更新。)感谢您的解释我可以添加一列来强制执行 POCO。
  • 至于我担心 EF 设计师已经(未)做过的事情,在我看来,MS 似乎有一个明确的模式,即用新设计制作新版本的东西,省略旧的做事方式,通常以强制重构或处​​理现在无法完成的事情的方式(如stackoverflow.com/questions/4719559/…),所以我担心它可能无法与旧表很好地配合,或者它会让人头疼它工作。但这看起来很不错。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 2018-02-21
  • 2016-08-12
  • 1970-01-01
相关资源
最近更新 更多