【问题标题】:How to use Entity Framework 6 to update many-to-many relationship?如何使用 Entity Framework 6 更新多对多关系?
【发布时间】:2015-11-03 00:12:31
【问题描述】:

有人在这里问过类似的问题:How can I use EF6 to update a many to many table

我提前提到了这一点,因为我无法得到任何可行的解决方案。

我还研究了 Code Project 上给出的解决方案: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”的学生。我们还有一个名叫“Stan”的学生,没有老师。我的任务是修改数据库,使 Sue 不再是 Tom 的学生,而 Stan 成为 Tom 的学生。

为此,我编写了以下代码:

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();
        }            
    }
}

看起来很简单:清除与汤姆关联的学生,然后将斯坦添加为汤姆的学生。但是,当我运行代码时,出现以下错误: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 表;其他两张桌子不要碰。

【问题讨论】:

    标签: entity-framework orm


    【解决方案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)
    );
    

    【讨论】:

    • 供将来参考,了解 EF 将要做什么的好方法是在 EF 中创建关系,然后进行迁移以为您构建数据库。这将向您展示 EF 的预期(即使您实际上并未使用迁移来创建实际的数据库)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多