2009-09-03 4 views
3

c'est la façon dont je l'ai utilisé pour sauver record avec LINQ: (mon Q est ci-dessous)Enregistrer une nouvelle ou mise à jour existe record avec LINQ

public void SaveEmployee(Employee employee) 
    { 

     using (BizNetDB db = new BizNetDB()) 
     { 
      BizNet.SqlRep.Data.Employee oldEmployee = (from e in db.Employees 
                 where e.EmployeeID == employee.EmployeeID 
                select e).SingleOrDefault(); 
      if (oldEmployee == null) 
      { 
       oldEmployee = new BizNet.SqlRep.Data.Employee(); 
       oldEmployee.BirthDate = employee.BirthDate; 
       oldEmployee.WorkRole = employee.WorkRole; 
       oldEmployee.CurrentFlag = employee.CurrentFlag; 
       oldEmployee.HireDate = employee.HireDate; 
       ... 
       db.Employees.InsertOnSubmit(oldEmployee); 
      } 
      else 
      { 
       if (oldEmployee.BirthDate.Date != employee.BirthDate.Date) 
        oldEmployee.BirthDate = employee.BirthDate; 
       if (oldEmployee.CurrentFlag != employee.CurrentFlag) 
        oldEmployee.CurrentFlag = employee.CurrentFlag; 
       if (oldEmployee.HireDate.Date != employee.HireDate.Date) 
        oldEmployee.HireDate = employee.HireDate; 
      } 

      oldEmployee.ModifiedDate = DateTime.Now; 
      db.SubmitChanges(); 
      employee.EmployeeID = oldEmployee.EmployeeID; 
     } 
    } 

mes questions sont les suivantes:

a. sont les déclarations si nesccery? pourquoi ne pas faire l'attribution sans la vérification ? mybe le bloc if prend plus de cpu.

b. pourquoi spearate le nouveau bloc d'enregistrement et le bloc de mise à jour?

lorsque l'enregistrement est nouveau, il fera

db.Employees.InsertOnSubmit(oldEmployee); 

puis procéder à la routine de mise à jour ...

+0

a. Les instructions if avant d'attribuer une valeur doivent empêcher le contexte de marquer l'enregistrement comme étant mis à jour si les valeurs ne changent pas réellement. b est bien géré par Joseph ci-dessous. –

Répondre

6

la façon dont vous ce fait la seule raison pour laquelle vous avez besoin de l'instruction if est de nouveau et insérez-le, donc j'utiliserais l'instruction if juste pour ça.

je ferais ceci:

public void SaveEmployee(Employee employee) 
{ 
    using (BizNetDB db = new BizNetDB()) 
    { 
     BizNet.SqlRep.Data.Employee oldEmployee = 
        (from e in db.Employees 
        where e.EmployeeID == employee.EmployeeID 
        select e).SingleOrDefault(); 

     if (oldEmployee == null) 
     { 
      oldEmployee = new BizNet.SqlRep.Data.Employee(); 
      db.Employees.InsertOnSubmit(oldEmployee); 
     } 

     if (oldEmployee.BirthDate.Date != employee.BirthDate.Date) 
      oldEmployee.BirthDate = employee.BirthDate; 
     if (oldEmployee.CurrentFlag != employee.CurrentFlag) 
      oldEmployee.CurrentFlag = employee.CurrentFlag; 
     if (oldEmployee.HireDate.Date != employee.HireDate.Date) 
      oldEmployee.HireDate = employee.HireDate; 

     oldEmployee.ModifiedDate = DateTime.Now; 
     db.SubmitChanges(); 
     employee.EmployeeID = oldEmployee.EmployeeID; 
    } 
} 

Je pense aussi qu'il ya un moyen de cartographier les propriétés d'un objet à l'autre, mais il me échappe pour le moment. Il peut ne pas fonctionner pour ce que vous essayez de faire de toute façon, car il semble que vous fassiez d'autres choses plus tard de toute façon avec ModifiedDate et EmployeeID.

+0

Avez-vous des ex pour la cartographie? – ari

Questions connexes