2009-08-08 83 views
0

我正在爲我的項目使用ADO.NET實體框架,並且我是這項技術的新成員。 有2個關聯表,其中一個是「personel」,另一個是「departmant」。當我試圖更新personel的部門,我得到這個錯誤:如何更新有關係的實體?

[System.InvalidOperationException] = {"'DEPARTMANID' property is piece of object's key information and can not be changed. "} 

這是我的代碼下面更新;

int DepartmantId = 1; 
int PersonelID = 2; 
    try 
      { 
       using (FirebirdEntityz fe = new FirebirdEntityz()) 
       { 

       var query = (from c in fe.PERSONEL.Include("DEPARTMANT") where c.PERSONELID == PersonelID select c).First(); 
       query.NAME = NAME; 
       query.SURNAME = SURNAME; 
       query.DEPARTMANT.DEPARTMANTID = DepartmantId; 

       int result = fe.SaveChanges(); 
       if (result > 0) 
       { 
        MessageBox.Show(result + " record updated"); 
       } 

      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.InnerException.ToString()); 
     } 
+0

旁註:它的 「部門」 和 「人事」 :) – Alex 2009-08-09 00:53:42

回答

1

事實上,這是一個更改實體主鍵的問題。只是,我相信這是拋出異常,因爲您正在嘗試更改DEPARTMENT實體的主鍵,而不是PERSONNEL。

你想在這裏完成的主要事情是改變外鍵的值,對吧?

1.Without往返DBS:如果是這樣你可以有兩種方式做到這一點

更換

query.DEPARTMANT.DEPARTMANTID = DepartmantId 

query.DEPARTMENTReference.EntityKey = new EntityKey("YourDataContext.DEPARTMENT", "DEPARTMENTId", value); 

2.By使往返行程數據庫以獲取您想要設置爲PERSONNEL實體的新部門:

using (FirebirdEntityz fe = new FirebirdEntityz()) 
     { 

    var query = (from c in fe.PERSONEL.Include("DEPARTMANT") where c.PERSONELID == PersonelID select c).First(); 
      query.NAME = NAME; 
      query.SURNAME = SURNAME; 
      query.DEPARTMANT.DEPARTMANTID = DepartmantId; 
    //query.DEPARTMANT.DEPARTMANTID = DepartmantId 
      var newDepartment = (from d in fe.DEPARTMENT 
            where d.DEPATMENTID==DepartmentId 
            select d).First(); 

      query.DEPATMENT = newDepatment; 

      int result = fe.SaveChanges(); 
      if (result > 0) 
      { 
       MessageBox.Show(result + " record updated"); 
      } 

     } 
0

我不熟悉的框架在所有的,但如果要我猜,我會說,你想改變在表的主鍵,你的框架不會讓您。

0

一旦創建並保存了一個實體,就不能更改關鍵屬性,並且從該錯誤看來DepartmentId被定義爲Personnel主鍵的一部分。

如果您需要更改主鍵,那通常表明您的「關鍵」不是真正的關鍵。

您應該考慮爲您的人員架構添加一列,以便不會更改的唯一密鑰,例如屬於標識列的PersonnelId(int)(假設您使用的是SQL Server)。

祝你好運!

0

你AR在這一行

query.DEPARTMANT.DEPARTMANTID = DepartmantId; 

做的是:

  • 你打開你的企業人事實體
  • 然後你打開relatet部門實體
  • 然後你」重新更改部門實體的主鍵。

我猜你真正想要做的是:

  • 開幕企業人事實體
  • 改變了企業人事實體的外鍵。

要做到這一點,使用此代碼:

using (FirebirdEntityz fe = new FirebirdEntityz()) 
{ 
    var department = (from d in fe.DEPARTMENT where d.ID == DepartmentID select d).FirstOrDefault(); 
    if(department==null)return; 
    var query = (from c in fe.PERSONEL where c.PERSONELID == PersonelID select c).FirstOrDefault(); 
    if(query==null)return; 
    query.NAME = NAME; 
    query.SURNAME = SURNAME; 
    query.DEPARTMANT = department; 

    int result = fe.SaveChanges(); 
}