【问题标题】:object with same key already exists objectstatemanager具有相同键的对象已存在 objectstatemanager
【发布时间】:2014-05-28 00:04:23
【问题描述】:

我有一个拥有另一个实体的虚拟集合的实体。当我尝试通过填充新插入对象的虚拟集合来插入数据时,它会抛出具有相同键的对象已经存在的错误。

我知道当实体未创建时,它的身份字段将具有 0 值。但是当我将数据存储在主表中时,我需要存储数据的集合。

public virtual void Insert(TEntity entity)
    {
        ((IObjectState)entity).ObjectState = ObjectState.Added;
        entityDbSet.Attach(entity);
        dataContext.SyncObjectState(entity);
    }

这是我正在使用的插入方法。以下是此操作的 poco 类(扩展类以保存数据集合的部分实现)。

public partial class UserDefinedData
{
    public int ID { get { return this.UserSelectedDValueID; } set { this.UserSelectedDValueID = value; } }
    public string Name { get { return this.entityTypeName; } }

    public virtual AM_AssetLocations AM_AssetLocations { get; set; }
}

public partial class AM_AssetLocations
{
    // Reverse navigation
    public virtual ICollection<UserDefinedData> UserDefinedDatas { get; set; }               
}

我正在使用 json 传递数据。这似乎也是正确的。因为数据的虚拟集合被正确地添加到实体中。

{"entity":{"ID":"0","CreatedByID":"0","CreatedDate":"04-13-2014 10:48","ModifiedByID":"","ModifiedDate":"","DeletedByID":"","DeletedDate":"","Deleted":"false","Name":"h","Active":"true","DisplayOrder":"0","Test Decimal":"10","":"","Test Number":"10","Test Plain Text":"h","Test RTF":"<p>hsj</p>","Test Yes No":"false","Test Yes No 2":"true","TestDate":"01-Apr-2014","TestDateTime":"10:00 AM","UserDefinedDatas":[{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"123","ValueNumber":"10"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"124","ValueListItemID":"25"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"122","ValueNumber":"10"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"117","ValueString":"h"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"119","ValueString":"<p>hsj</p>"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"125","ValueYesNo":0},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"126","ValueYesNo":1},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"120","ValueDate":"01-Apr-2014"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"121","ValueDate":"08-Apr-2014 10:00 AM"}]}}

请帮我解决这个问题。

注意:如果我尝试将身份字段分配给我自己,只是为了解决这个相同的关键异常,它会引发参照完整性异常。我知道存储真实集合应该可以正常工作。但这对我不起作用。请给我一些指导和解决方案。

谢谢, 萨钦

【问题讨论】:

  • SyncObjectState 在做什么?顺便说一句,这个 JSON 字符串对于水平滚动是没有用的。

标签: c# entity-framework exists objectstatemanager


【解决方案1】:

Attach 用于附加现有实体。

上下文应该自己分配正确的状态,在你的情况下不需要手动进行

public virtual void Insert(TEntity entity)
{
    //((IObjectState)entity).ObjectState = ObjectState.Added;
    context.TEntityDbSet.Add(entity);//Add, not Attach!
    //dataContext.SyncObjectState(entity);
    context.SaveChanges()
}

.. http://msdn.microsoft.com/en-us/data/jj592676.aspx

【讨论】:

  • 谢谢。这解决了相同的关键错误。这不是完整的解决方案,但它肯定解决了相同的关键错误。所以接受作为答案,以便对其他人有所帮助。
【解决方案2】:

您好,感谢大家的帮助。我改变了执行此操作的方式。我创建了存储过程,它接受子集合的主实体和用户定义的表类型,可以从.net页面作为数据集传递。这对我来说很好。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    相关资源
    最近更新 更多