【问题标题】:How do you submit objects with a many to many relationship using the Entities Framework?如何使用实体框架提交具有多对多关系的对象?
【发布时间】:2010-07-22 20:01:29
【问题描述】:

这是我昨天问的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}

知道我做错了什么吗?我必须以特殊顺序插入它们吗?如何将多对多关系正确写入数据库?

感谢您的帮助!!!

【问题讨论】:

  • 我会问你我在上一个问题中问过的同样的问题:你在 JunctionHobbiesPeople 上有 真正的 PK 吗?
  • 我不确定我是否理解 - 真正的 PK?这些列以键符号显示,以表明它们已被标记为主键,并且当我在 Junction 表存在之前将数据添加到表中时,它会自动递增。我还有什么需要做的吗?
  • @evan - 我认为 Craig 是在数据库中讨论,而不仅仅是在 EF 设计器中。如果您只处理 Hobbies 和 People 这两个表,然后在它们之间建立多对多关联呢?
  • @Craig - 我终于明白你的意思了!!我将连接处的两个键都标记为 PK,现在它可以工作了。我是个白痴! :)

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


【解决方案1】:

我想你自 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"/>

删除存储:名称和架构之前的“存储:”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多