如何使用Entity Framework 6更新多对多关系?

时间:2015-11-03 00:12:32

标签: entity-framework orm

其他人在此问了一个类似的问题: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,并推断出它们之间的关系。

enter image description here

这是上面的一个脚本;数据库中没有别的东西。

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表;不应该触及其他两个表。

1 个答案:

答案 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)
);