其他人在此问了一个类似的问题:How can I use EF6 to update a many to many table
我事先提到这一点,因为我无法获得任何解决方案。
我还研究了代码项目的解决方案:http://www.codeproject.com/Tips/893609/CRUD-Many-to-Many-Entity-Framework,但这对我也不起作用。
我想尽量保持这个。
我有两张桌子:dbo.Teacher和dbo.Student。每个都有一个“ID”列作为主键。我还有一个名为dbo.StudentTeacher的第三个表,它只有两列,都是非可空的,并且是前两个表的外键;换句话说,它建立了教师和学生之间的多对多关系。正如预期的那样,EDMX设计只显示了dbo.Student和dbo.Teacher,并推断出它们之间的关系。
这是上面的一个脚本;数据库中没有别的东西。
CREATE TABLE dbo.Teacher
(
Id INT NOT NULL PRIMARY KEY,
Name VARCHAR(MAX)
);
CREATE TABLE dbo.Student
(
Id INT NOT NULL PRIMARY KEY,
Name VARCHAR(MAX)
);
CREATE TABLE dbo.TeacherStudent
(
TeacherId INT NOT NULL FOREIGN KEY REFERENCES Teacher(Id),
StudentId INT NOT NULL FOREIGN KEY REFERENCES Student(Id)
);
INSERT INTO Teacher(Id, Name)
VALUES
(101, 'Tom');
INSERT INTO Student(Id, Name)
VALUES
(201, 'Sue'),
(202, 'Stan');
INSERT INTO TeacherStudent(TeacherId, StudentId)
VALUES
(101, 201);
现在我已经建立了数据结构,我想完成一个非常简单的任务。从上面的脚本中,您可以看到我们有一位名叫“Tom”的老师,他的学生名为“Sue”。我们还有一个名叫“斯坦”的学生,没有老师。我的任务是修改数据库,以便苏不再是汤姆的学生而斯坦成为汤姆的学生。
为实现这一目标,我编写了以下代码:
class Program
{
static void Main(string[] args)
{
using (var entities = new TestEntities())
{
// There is only one teacher in the system.
Teacher teacher = entities.Teachers.Single();
// This teacher has a student #201: Sue.
// I want to replace her with student #202: Stan.
teacher.Students.Clear();
teacher.Students.Add(new Student() { Id = 202 });
entities.SaveChanges();
}
}
}
看起来非常简单:清除与Tom相关的学生,然后将Stan添加为Tom的学生。但是,当我运行代码时,我收到以下错误:Unable to update the EntitySet 'TeacherStudent' because it has a DefiningQuery and no <DeleteFunction> element exists in the <ModificationFunctionMapping> element to support the current operation.
我尝试在没有添加Stan的情况下尝试将Sue从Tom的学生中移除来简化问题,并且我得到完全相同的错误消息。
据我了解,当Entity Framework没有足够的信息来执行您想要的操作时,通常会发生此错误,但我真的看不到缺少的内容。有两个简单的表,它们之间有一个连接表,我需要能够更改哪些行与哪些其他行相关。
我还应该注意,如果我没有弄错,我希望在这个例子中做出的改变应该只影响dbo.TeacherStudent表;不应该触及其他两个表。
答案 0 :(得分:1)
好的,经过更多Google-Fu之后,我明白了。
即使连接表必须只有两列,每列都外键键入两个要关联的表,连接表仍然需要一个主键,它可以是两个外键的组合。
因此,dbo.TeacherStudent应该用这个创建:
CREATE TABLE dbo.TeacherStudent
(
TeacherId INT NOT NULL FOREIGN KEY REFERENCES Teacher(Id),
StudentId INT NOT NULL FOREIGN KEY REFERENCES Student(Id),
PRIMARY KEY(TeacherId, StudentId)
);