如何使用实体框架提交具有多对多关系的对象?

时间:2010-07-22 20:01:30

标签: c# entity-framework asp.net-mvc-2 many-to-many

这是this question的一个跟进问题,我昨天问过。我已经找到了我认为让我感到悲伤的问题,我认为我可以更清晰地解释这种情况。

我似乎无法弄清楚如何使用C#ASP.NET MVC 2项目中的实体框架编写与SQL数据库有多对多关系的对象。

以下是我的尝试:

我有一个非常简单的数据库,只有两个表。具有列名称和描述的业余爱好以及具有名称和姓氏的列的人员。我创建了一个默认的.edmx,选中了所有内容。 (两者都使用int作为主键(HobbieID,PersonID),我在数据库中设置为自动递增。)

然后我可以成功使用以下代码:

SampleEntities entities = new SampleEntities();
Hobby h1 = new Hobby() { Name = "Tennis", Description = "Not golf" };
Person p1 = new Person() { First = "Jack", Last = "Black" };
entities.Hobbies.AddObject(h1);
entities.People.AddObject(p1);
entities.SaveChanges();

两个都正确地添加到数据库中。现在它破裂了。

我在数据库中添加另一个名为JunctionHobbiesPeople的表,它有两列(HobbieID,PersonID),我使用数据库设计器中的关系弹出窗口创建外键。然后我将JunctionHobbiesPeople表添加到实体设计器(通过右键单击更新,使用GUI),它以图形方式显示正确的多对多关系。

然后我尝试以下代码:

SampleEntities entities = new SampleEntities();
Hobby h1 = new Hobby() { Name = "Tennis", Description = "Not golf" };
Person p1 = new Person() { First = "Jack", Last = "Black" };
p1.Hobbies.Add(h1);
entities.People.AddObject(p1);
entities.SaveChanges();

我得到的第一个错误是关于DefiningQuery。我可以通过在.edmx文件后面的代码中删除xml中的所有DefiningQuery元素来解决这个问题。说到这个问题,那个元素是什么 - 我不应该删除吗?

在该错误消失后,我收到以下错误:

InnerException  {"Invalid object name 'ModelStoreContainer.JunctionHobbiesPeople'."}    System.Exception {System.Data.SqlClient.SqlException}

任何想法都是我做错了什么?我是否必须按特殊顺序插入它们?如何才能将多对多关系正确写入数据库?

感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

我想你已经解决了这个问题,因为你在2010年发布了,无论如何这可能会帮助别人:) 我使用MVC3时遇到了同样的问题。 我原来的edmx文件有一行看起来像这样:

<EntitySet Name="StockUpdates" EntityType="SwebotModel.Store.StockUpdates" store:Type="Tables" store:Schema="dbo" store:Name="StockUpdates"/>

为了解决这个问题,我将其更改为:

<EntitySet Name="StockUpdates" EntityType="SwebotModel.Store.StockUpdates" store:Type="Tables" Schema="dbo"/>

删除商店:名称和架构之前的“商店:”。