Entity Framework 6: Clone object except ID

前端 未结 5 1086
旧时难觅i
旧时难觅i 2020-12-01 04:48

In my MVVM program I have a Model class (say MyModel) from which I have an instance of reading from the database (using Entity Framework). When retrieving the o

5条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-01 05:28

    When using ObjectContext the answer provided by QuantumHive does not work.

    The error returned in that situation is :

    An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
    System.InvalidOperationException: An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
       at System.Data.Objects.ObjectStateManager.AddEntry(IEntityWrapper wrappedObject, EntityKey passedKey, EntitySet entitySet, String argumentName, Boolean isAdded)
       at System.Data.Objects.ObjectContext.AddSingleObject(EntitySet entitySet, IEntityWrapper wrappedEntity, String argumentName)
       at System.Data.Objects.DataClasses.RelatedEnd.AddEntityToObjectStateManager(IEntityWrapper wrappedEntity, Boolean doAttach)
       at System.Data.Objects.DataClasses.RelatedEnd.AddGraphToObjectStateManager(IEntityWrapper wrappedEntity, Boolean relationshipAlreadyExists, Boolean addRelationshipAsUnchanged, Boolean doAttach)
       at System.Data.Objects.DataClasses.RelatedEnd.Add(IEntityWrapper wrappedTarget, Boolean applyConstraints, Boolean addRelationshipAsUnchanged, Boolean relationshipAlreadyExists, Boolean allowModifyingOtherEndOfRelationship, Boolean forceForeignKeyChanges)
       at System.Data.Objects.DataClasses.RelatedEnd.Add(IEntityWrapper wrappedEntity, Boolean applyConstraints)
       at System.Data.Objects.DataClasses.EntityReference`1.set_ReferenceValue(IEntityWrapper value)
       at System.Data.Objects.DataClasses.EntityReference`1.set_Value(TEntity value)
    

    To correctly clone an entity framework object (at least in EF6.0) is:

    /// 
    /// Clone a replica of this item in the database
    /// 
    /// The cloned item
    public Item CloneDeep()
    {
        using (var context = new EntityObjectContext())
        {
            var item = context.Items
                .Where(i => i.ItemID == this.ItemID)
                .Single();
            context.Detach(item);
            item.EntityKey = null;
            item.ItemID = 0;
            return item;
        }
    }
    

提交回复
热议问题