1

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

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

问题:

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

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

4

1 回答 1

4

是的,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 的设计者没有处理过你的案子吗?

于 2013-03-12T04:24:00.917 回答