Entity framework 如何使用实体框架中的SQL多对多表?

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

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

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

问题:

如果我学习使用实体框架的多对多系统,它会使用并更新其他应用程序使用的多对多表吗


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

是的,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
            });
为了实现完整的实现,你应该在谷歌上搜索你的EF版本

对于包含额外列的链接表(例如创建日期),它们与所有其他表一样由POCO表示。如果你真的怀疑EF管理链接表的能力,你可以通过在纯链接表中添加一个唯一的id列来迫使它走这条路,但我绝对不建议这样做


可以这样想:EF已经存在了一段时间,并且已经达到了一定程度的成熟。再加上多对多关系在数据库中并不少见这一事实。你真的认为EF的设计者没有处理你的案例吗?

是的,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
            });
为了实现完整的实现,你应该在谷歌上搜索你的EF版本

对于包含额外列的链接表(例如创建日期),它们与所有其他表一样由POCO表示。如果你真的怀疑EF管理链接表的能力,你可以通过在纯链接表中添加一个唯一的id列来迫使它走这条路,但我绝对不建议这样做


可以这样想:EF已经存在了一段时间,并且已经达到了一定程度的成熟。再加上多对多关系在数据库中并不少见这一事实。您真的认为EF的设计师没有处理您的案例吗?

什么版本的实体框架?它是实体框架v4.0.30319。什么版本的实体框架?它是实体框架v4.0.30319。谢谢Manos!现在我需要重温一下在代码中调用modelBuilder,而不是让VS向导根据数据库自动神奇地创建对象模型。(也就是说,您的代码示例看起来很棒,但我需要弄清楚将其放在何处,以及将来更新数据库需要哪些步骤,因为在过去,数据库是使用向导更新的。)感谢您的解释,我可以添加一列来强制执行POCO。至于我担心EF设计师(没有)做了什么,在我看来,微软有一个明确的模式,就是用新的设计来制作新版本的东西,而这些新设计忽略了旧的做事方式,通常是以一种强迫重新分解或处理现在无法完成的事情的方式(如中),所以我担心它可能无法很好地处理旧表,或者让它工作起来会让人头疼。但这看起来很不错。再次感谢!谢谢你,马诺斯!现在我需要重温一下在代码中调用modelBuilder,而不是让VS向导根据数据库自动神奇地创建对象模型。(也就是说,您的代码示例看起来很棒,但我需要弄清楚将其放在何处,以及将来更新数据库需要哪些步骤,因为在过去,数据库是使用向导更新的。)感谢您的解释,我可以添加一列来强制执行POCO。至于我担心EF设计师(没有)做了什么,在我看来,微软有一个明确的模式,就是用新的设计来制作新版本的东西,而这些新设计忽略了旧的做事方式,通常是以一种强迫重新分解或处理现在无法完成的事情的方式(如中),所以我担心它可能无法很好地处理旧表,或者让它工作起来会让人头疼。但这看起来很不错。再次感谢!