如何使用Entity Framework中的SQL多对多表?

时间:2013-03-12 02:07:20

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

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

也就是说,有一张Foos表和一张Bars表,然后是一张带有Foo和Bar ID的表,列出哪些Foos与哪些Bars有关,我不想停止使用这种关系表,特别是因为有另一个LINQ应用程序大量使用此关系表。

问题:

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

如果没有,有什么方法可以让Entity Framework不忽略多对多关系表,那么我可以编写代码来使用现有的表吗?

1 个答案:

答案 0 :(得分: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的设计师没有处理过你的案子吗?