1

我嘗試使用鏈接到實體,並且想直接在我的應用程序中使用我的實體。更新實體框架中的現有EntityCollection

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Calandar.Business.Manager.Data; 

namespace Calandar.Business.Models.Args 
{ 
    public class SaveExpertArgs 
    { 
     public ExpertEntity Expert { get; set; } 
     public SaveExpertArgs(ExpertEntity expert) 
     { 
      Expert = expert; 
     } 
    } 
} 

public ExpertEntity SaveExpert(SaveExpertArgs args) 
{    
    string connString = ConfigurationManager.ConnectionStrings["CalendarContainer"].ConnectionString; 

    using (CalendarContainer dbContext = new CalendarContainer(connString)) 
    {    
     ExpertEntity expert = (from e in dbContext.ExpertEntities 
           where e.ExpertIdentifier == args.Expert.ExpertIdentifier 
           select e).FirstOrDefault(); 
     if (expert == null) 
     { 
      args.Expert.ExpertIdentifier = Guid.NewGuid(); 
      dbContext.AddToExpertEntities(args.Expert); 
     } 
     else 
     { 
      dbContext.ExpertEntities.ApplyCurrentValues(args.Expert);    

      foreach (TimeSlotEntity t in args.Expert.TimeSlotEntities) 
      { 
       dbContext.TimeSlotEntities.ApplyCurrentValues(t); 
      } 
     }    

     dbContext.SaveChanges(); 
     return args.Expert; 
    } 
} 

我試圖挽救我的專業實體,它的工作,但我不知道如何保存我的EntityCollection在我的專業實體。有些身體可以幫助我嗎?

回答

0

好吧,我發現我怎麼可以更新我的實體集合。

有我的技術。我沒有找到該技術的任何文件,所以給我你的反饋

public ExpertEntity SaveExpert(SaveExpertArgs args) 
     { 

      string connString = ConfigurationManager.ConnectionStrings["CalendarContainer"].ConnectionString; 
      using (CalendarContainer dbContext = new CalendarContainer(connString)) 
      { 
       ExpertEntity expert = (from e in dbContext.ExpertEntities 
             where e.ExpertIdentifier == args.Expert.ExpertIdentifier 
             select e).FirstOrDefault(); 
       if (expert == null) 
       { 
        args.Expert.ExpertIdentifier = Guid.NewGuid(); 
        dbContext.AddToExpertEntities(args.Expert); 
       } 
       else 
       { 
        dbContext.ExpertEntities.ApplyCurrentValues(args.Expert); 
        GenericUpdateEntityCollection(args.Expert.TimeSlotEntities, dbContext); 
       } 
       dbContext.SaveChanges(); 
       return args.Expert; 
      } 
     } 


private void GenericUpdateEntityCollection<T>(EntityCollection<T> collection, ObjectContext dbContext) 
      where T : EntityObject, new() 
     { 
      int count = collection.Count(); 
      int current = 0; 
      List<T> collectionItemList = collection.ToList(); 
      bool isAdded = false; 
      while (current < count) 
      { 
       Object obj = null; 
       // Essai de récupéré l'objet dans le context pour le mettre à jour 
       dbContext.TryGetObjectByKey(collectionItemList[current].EntityKey, out obj); 
       if (obj == null) 
       { 
        // Si l'objet n'existe pas, on en créer un nouveau 
        obj = new TimeSlotEntity(); 
        // On lui donne l'entity Key du nouvelle objet 
        ((T)obj).EntityKey = collectionItemList[current].EntityKey; 
        // On l'ajoute au context, dans le timeslot 
        dbContext.AddObject(((T)obj).EntityKey.EntitySetName, obj); 
        // On récupère l'objet du context qui à le même entity key que le nouveau recu en pramètre, le but est d'avoir un context d'attacher 
        dbContext.TryGetObjectByKey(collectionItemList[current].EntityKey, out obj); 
        // On change l'état de l'objet dans le context pour modifier, car 
        dbContext.ObjectStateManager.ChangeObjectState(obj, System.Data.EntityState.Modified); 
        // On change l'état de l'objet passé en paramètre pour qu'il soit au même state que celui dans le context 
        collection.CreateSourceQuery().Context.ObjectStateManager.ChangeObjectState(collectionItemList[current], System.Data.EntityState.Modified); 
        // On place notre flag pour dire que nous avons ajouter dans le context les donnée 
        isAdded = true; 
       } 

       if (obj != null) 
       { 
        // On applique les changements de l'objet passé en parametre à celui dans le context 
        dbContext.ApplyCurrentValues<T>(((T)obj).EntityKey.EntitySetName,collectionItemList[current]); 
        // On replace les state des deux objet, celui dans le context et celui passé en parametre à added pour la sauvegarde. 
        if (isAdded) 
        { 
         dbContext.ObjectStateManager.ChangeObjectState(obj, System.Data.EntityState.Added); 
         collection.CreateSourceQuery().Context.ObjectStateManager.ChangeObjectState(collectionItemList[current], System.Data.EntityState.Added); 
        } 
       } 
       current++; 
      } 
     } 
0

儘量擺脫的東西:

public ExpertEntity SaveExpert(SaveExpertArgs args) 
{    
    string connString = ConfigurationManager.ConnectionStrings["CalendarContainer"].ConnectionString; 

    using (CalendarContainer dbContext = new CalendarContainer(connString)) 
    {    
     ExpertEntity expert = (from e in dbContext.ExpertEntities 
           where e.ExpertIdentifier == args.Expert.ExpertIdentifier 
           select e).FirstOrDefault(); 
     if (expert == null) 
     { 
      args.Expert.ExpertIdentifier = Guid.NewGuid(); 
      dbContext.AddToExpertEntities(args.Expert); 
     } 
     //else 
     //{ 
      dbContext.ExpertEntities.ApplyCurrentValues(args.Expert);    

      foreach (TimeSlotEntity t in args.Expert.TimeSlotEntities) 
      { 
       dbContext.TimeSlotEntities.ApplyCurrentValues(t); 
      } 
     //}    

     dbContext.SaveChanges(); 
     return args.Expert; 
    } 
} 
+0

不工作,我得到錯誤:ObjectContext的實例已設置,並且不能再被用於需要連接的操作。 – 2010-10-28 00:49:48

+0

您可以嘗試在初始加載時使用「包含」命令,以便從專家處獲取子對象。 http://msdn.microsoft.com/en-us/library/bb896272.aspx – Slappy 2010-10-28 01:45:35

+0

我嘗試做exper.TimeSlotEntities.Load();但是當我使用我的arg.Expert.TimeSlotEntities時,此對象已斷開連接。有沒有辦法與WrappedRelatedEntities一起工作? – 2010-10-28 02:26:22