【问题标题】:entity relation object update实体关系对象更新
【发布时间】:2011-05-18 21:25:11
【问题描述】:

请你告诉我我哪里错了。我有以下代码:

public void UpdateClient(Client oClient)
    {                                        
        foreach(Mitarbeiter item in oClient.Mitarbeiters)
        {
            if (item.MiID==0)
            {                    
                context.Mitarbeiters.AddObject(item);                    
            }
            else {
                var key = context.CreateEntityKey("Mitarbeiters",item);
                object original;
                if (context.TryGetObjectByKey(key,out original))
                {
                    context.ApplyCurrentValues(key.EntitySetName,item);
                }
            }
        }
        context.Clients.First(c => c.ClID == oClient.ClID);            
        context.Clients.ApplyCurrentValues(oClient);


       context.SaveChanges();

} 我收到了

ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法跟踪具有相同键的多个对象。

当我向 Mitarbeiters 添加一个新对象时

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    假设您的类Mitarbeiter 具有Client 的导航属性,并且当您运行循环时它不为空(所以item.Client != null)然后通过将item 添加到ObjectSet,您还可以添加引用的@ 987654325@ 进入状态Added 的上下文。 (添加实体不仅会添加实体本身,还会添加尚未在上下文中的所有引用实体。)稍后(context.Clients.First(c => c.ClID == oClient.ClID);)您第二次加载客户端,该客户端已经在Added 状态下的上下文中是异常的原因。

    尝试将客户端加载到上下文中你添加item:

    public void UpdateClient(Client oClient)
    {                                        
        context.Clients.First(c => c.ClID == oClient.ClID);
    
        foreach(Mitarbeiter item in oClient.Mitarbeiters)
        {
            if (item.MiID==0)
            {                    
                context.Mitarbeiters.AddObject(item);                    
            }
            else {
                var key = context.CreateEntityKey("Mitarbeiters",item);
                object original;
                if (context.TryGetObjectByKey(key,out original))
                {
                    context.ApplyCurrentValues(key.EntitySetName,item);
                }
            }
        }
        context.Clients.ApplyCurrentValues(oClient);
    
        context.SaveChanges();
    }
    

    只是猜测,我不确定这是否能解决您的问题。

    【讨论】:

    • 谢谢 Slauma,你是对的。我只需要在调用 AddObject 之前设置 item.Client = null。
    猜你喜欢
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多