其他人在這裏問了一個類似的問題:How can I use EF6 to update a many to many table如何使用實體框架6來更新多對多的關係?
我提前說過,因爲我沒有得到任何工作解決方案。
我還研究了代碼項目上的解決方案: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」的學生。我們還有一位名叫「斯坦」的學生,沒有老師。我的任務是修改數據庫,以便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.
我嘗試通過嘗試從湯姆的學生中刪除Sue而不添加Stan來簡化問題,並且得到完全相同的錯誤消息。
據我所知,當Entity Framework沒有足夠的信息去做你想做的事情時,通常會發生這個錯誤,但我真的看不到什麼東西丟失了。有兩個簡單的表,它們之間有一個連接表,我需要能夠更改哪些行與哪些行相關。
我還應該注意,如果我沒有弄錯,我希望在這個例子中做出的改變只會影響dbo.TeacherStudent表;另外兩張桌子不應該碰。
以供將來參考的好辦法,看看有什麼EF打算做的是建立在EF的關係,然後讓移民建數據庫:
因此,dbo.TeacherStudent應與此創建爲你。這將向您展示EF期望的內容(即使您實際上並未使用遷移實際創建數據庫) –