【发布时间】: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