2009-08-08 8 views
0

私は自分のプロジェクトにADO.NET Entityフレームワークを使用しています。このTechonologyでは初めてです。 2つのテーブルが関連付けられています.1つは "個人"で、もう1つは "departmant"です。私は個人的のdepartmantを更新しようとしたとき、私はこのエラーを取得しています:関係のあるエンティティを更新するには?

[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

答えて

1

実際、エンティティの主キーを変更すると問題になります。ちょうど、PERSONNELではなくDEPARTMENTエンティティの主キーを変更しようとしているので、例外がスローされていると思います。

ここで達成したい主なものは、外部キーの値を変更することです。 DBSへ

1.Without往復:あなたは二つの方法でそれを行うことができますもしそうなら

query.DEPARTMANT.DEPARTMANTID = DepartmantId 

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

2.Byはへのラウンドトリップを作ると交換あなたが人事エンティティに設定する新しいDEPARTMENTを取得するためのデータベース:

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のは、人事の主キーの一部として定義されているようです。

主キーを変更する必要がある場合は、通常、「キー」が実際にキーではないことを示す良い指標です。

PersonnelId(int)(SQL Serverを使用していると仮定します)のIdentity列など、変更されない一意のキーに対して、Personnelスキーマに列を追加することを検討する必要があります。

幸運を祈る!

0

あなたはこのラインで

query.DEPARTMANT.DEPARTMANTID = DepartmantId; 

をやっARは次のとおりです。

  • あなたは
  • あなたの個人的実体を開いているそして、あなたは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(); 
} 
関連する問題