【问题标题】:Update existing EntityCollection in Entity Framework更新实体框架中的现有 EntityCollection
【发布时间】:2011-05-01 01:53:42
【问题描述】:

我尝试使用指向实体的链接,并且我想在我的应用程序中直接使用我的实体。

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 保存在我的专家实体中。有人可以帮助我吗?

【问题讨论】:

    标签: c# entity-framework linq-to-entities entity-framework-4 edmx


    【解决方案1】:

    尝试摆脱else:

    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;
        }
    }
    

    【讨论】:

    • 不工作,我得到错误:ObjectContext 实例已被释放,不能再用于需要连接的操作。
    • 您可以尝试在初始加载时使用“包含”命令从专家那里带入子对象。 msdn.microsoft.com/en-us/library/bb896272.aspx
    • 我尝试做 exper.TimeSlotEntities.Load();但是当我使用我的 arg.Expert.TimeSlotEntities 时,这个对象被断开了。有没有办法使用 WrappedRelatedEntities?
    【解决方案2】:

    好的,我找到了如何更新我的实体集合。

    这是我的技术。我没有找到任何关于该技术的文档,所以请给我您的反馈

    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++;
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 2020-05-14
      相关资源
      最近更新 更多