Is is possible to check if an object is already attached to a data context in Entity Framework?

后端 未结 5 969
清歌不尽
清歌不尽 2020-11-28 04:26

I am getting the following error when trying to attach an object that is already attached to a given context via context.AttachTo(...):

A

5条回答
  •  野性不改
    2020-11-28 05:11

    Here's what I ended up with, which works very nicely:

    public static void AttachToOrGet(this ObjectContext context, string entitySetName, ref T entity)
        where T : IEntityWithKey
    {
        ObjectStateEntry entry;
        // Track whether we need to perform an attach
        bool attach = false;
        if (
            context.ObjectStateManager.TryGetObjectStateEntry
                (
                    context.CreateEntityKey(entitySetName, entity),
                    out entry
                )
            )
        {
            // Re-attach if necessary
            attach = entry.State == EntityState.Detached;
            // Get the discovered entity to the ref
            entity = (T)entry.Entity;
        }
        else
        {
            // Attach for the first time
            attach = true;
        }
        if (attach)
            context.AttachTo(entitySetName, entity);
    }
    

    You can call it as follows:

    User user = new User() { Id = 1 };
    II.AttachToOrGet("Users", ref user);
    

    This works very nicely because it's just like context.AttachTo(...) except you can use the ID trick I cited above each time. You end up with either the object previously attached or your own object being attached. Calling CreateEntityKey on the context makes sure it's nice and generic and will work even with composite keys with no further coding (because EF can already do that for us!).

提交回复
热议问题