2009-08-08 8 views
0

J'utilise ADO.NET Entity Framework pour mon projet et je suis nouveau dans cette technologie. Il y a 2 tables associées, l'une est "personel" l'autre est "departmant". Quand j'ai essayé de mettre à jour le Departmant de personel Je reçois cette erreur:Comment mettre à jour les entités qui ont une relation?

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

Voici mon code ci-dessous pour la mise à jour;

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

Sidenote: Son "ministère" et "Personnel" :) – Alex

Répondre

1

En effet, il est difficile de modifier une clé primaire d'une entité. Juste, je crois que ça lance une exception parce que vous essayez de changer la clé primaire de l'entité DEPARTEMENT, pas PERSONNEL.

La chose principale que vous voulez accomplir ici est de changer la valeur de la clé étrangère, non? Si oui, vous pouvez le faire de deux façons:

1.Sans voyages ronds à dbs:

Remplacer

query.DEPARTMANT.DEPARTMANTID = DepartmantId 

avec

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

2.By faire des allers-retours à la base de données pour obtenir le nouveau DEPARTEMENT que vous souhaitez définir pour l'entité 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

Je ne suis pas au courant de ce cadre du tout, mais si je devais deviner, je dirais que vous essayez de la modifier la clé primaire dans la table et votre cadre ne laissera pas toi.

0

Les propriétés de clé ne peuvent pas être modifiées une fois qu'une entité a été créée et enregistrée, et à partir de cette erreur, il semble que DepartmentId est défini comme faisant partie de la clé primaire du personnel.

Si vous avez besoin de changer votre clé primaire, c'est généralement une bonne indication que votre "clé" n'est pas vraiment une clé.

Vous devez envisager d'ajouter une colonne à votre schéma Personnel pour une clé unique qui ne change pas, quelque chose comme PersonnelId (int) qui est une colonne d'identité (en supposant que vous utilisez SQL Server).

Bonne chance!

0

Ce que vous ar faire dans cette ligne

query.DEPARTMANT.DEPARTMANTID = DepartmantId; 

est:

  • vous ouvrez votre entité personel
  • Ensuite, vous ouvrez l'entité département relatet
  • Alors vous re changer la clé primaire de votre entité département.

Ce que je suppose que ce que tu voulais vraiment faire est:

  • Ouverture de l'entité personel
  • Modification de la clé étrangère de l'entité personel.

Pour ce faire, utilisez ce code:

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