2015-11-03 86 views
1

其他人在這裏問了一個類似的問題: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並推斷它們之間的關係。

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」的學生。我們還有一位名叫「斯坦」的學生,沒有老師。我的任務是修改數據庫,以便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表;另外兩張桌子不應該碰。

回答

1

好的,經過一番Google-Fu之後,我明白了。

即使連接表必須只有兩列,每列外鍵鍵入要關聯的兩個表,連接表仍然需要一個主鍵,該主鍵可以是兩個外鍵的組合。

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) 
); 
+0

以供將來參考的好辦法,看看有什麼EF打算做的是建立在EF的關係,然後讓移民建數據庫:

因此,dbo.TeacherStudent應與此創建爲你。這將向您展示EF期望的內容(即使您實際上並未使用遷移實際創建數據庫) –