关于Entity Framework中的Attached报错的完美解决方案
发布日期:2021-05-09 09:35:01 浏览次数:12 分类:博客文章

本文共 6135 字,大约阅读时间需要 20 分钟。

���������������Entity Framework������CRUD���������������������������������������������������NoTracking���������������������������������������������

//������DB First������������������������aTestEntities db = new aTestEntities();db.Companies.MergeOption = MergeOption.NoTracking;//������CODE First���Model First������������������������aTestEntities db = new aTestEntities();db.Companies.AsNoTracking();

������������NoTracking���������������������������������������������CUD������������������������������������������������

���������������������������������������������������������������������������������������������������������������������������

������������������������NoTracking������������������������������������������Detached,���������������CRD���������������������Attach���������������������������������������������������������������������������������������������������������������������������������CRD������������Detached������������������������Attach���������������������������������������������������

������������������Attach������������������������������������������������������������������Attach������������Attached������������������������������Attach���������EF���������������������������������������������������������������������������IsAttached������������������������������������������������

������������������DB First���������������������������������EntityObject���������������������������EntityObject.EntityKey���������������������

///         /// ������entity������������Attached        ///         ///         /// 
public bool IsAttached
(TEntity entity) where TEntity : EntityObject { ObjectStateEntry entry = null; if (dbContext.ObjectStateManager.TryGetObjectStateEntry(entity.EntityKey, out entry)) { if (entry.State != EntityState.Detached) { return true; } } return false; }

������������������Model First���Code First������������������������������������������������������������������������EntityObject���������������������������������������������������������������������������������������������������������������������������������������IEntityWithId������������������������������������������������,���������������������������������������������

public interface IEntityWithId    {        Guid Id { get; set; }    }    public class EntityClass : IEntityWithId    {        Guid Id { get; set; }        //...������������    }///         /// ������entity������������Attached        ///         /// 
/// ///
public bool IsAttached
(TEntity entity) where TEntity : IEntityWithId { TEntity localEntity = dbContext.Set
().Local.Where(t => t.Id == entity.Id).FirstOrDefault(); if (localEntity != null) { if (dbContext.Entry(localEntity).State != EntityState.Detached) { return true; } } return false; }

������������������Model First���Code First���������������������������������������������������������������������������������IsAttached���������������������������������������VS Debug������������������������������������������������������������������������������������������������EntityWrapperWithoutRelationships<TEntity>������������������������������������������_entityWrapper������������������������������������������������������EntityWrapper������������������������EntityKey������������������������������������EntityObject.EntityKey���������������������������������������������������EntityKey������������������������������������������������������������������������������������������������EntityWrapperWithoutRelationships���EntityWrapper������������������������internal,������������������������������������������������������������������������������������������������������������������������������������������������������������

///         /// ������entity������������Attached        ///         ///         /// 
private bool IsAttached(TEntity entity) { var objectContext = ((IObjectContextAdapter)this.baseContext).ObjectContext; ObjectStateEntry entry = null; if (objectContext.ObjectStateManager.TryGetObjectStateEntry(GetEntityKey(entity), out entry)) { if (entry.State != EntityState.Detached) { return true; } } return false; } /// /// ���������������������������������EntityKey /// /// ///
private EntityKey GetEntityKey(TEntity entity) { var entityWrapper = entity.GetType().GetField("_entityWrapper").GetValue(entity);//������������_entityWrapper������ var entityWrapperType = entityWrapper.GetType();//��������������������� var entityKey = entityWrapperType.GetProperty("EntityKey").GetValue(entityWrapper, null);//������EntityKey������������ return (EntityKey)entityKey; }

���������IsAttached���������������������������������������������������������Attach���������������������������������������������������������������������������������������������IsAttached���������������������������������Attached���������������Attach���������������������������������������

public virtual void Update(TEntity entity, bool autoCommit = false)        {            this.ValidateEntity(entity, false);            if (!this.IsAttached(entity))            {                this.objectSet.Attach(entity);                this.baseContext.Entry(entity).State = EntityState.Modified;            }            if (autoCommit)            {                this.Commit();            }        }        public virtual void Remove(TEntity entity, bool autoCommit = false)        {            if (!this.IsAttached(entity))            {                this.objectSet.Attach(entity);            }            this.objectSet.Remove(entity);            if (autoCommit)            {                this.Commit();            }        }

 

上一篇:关于C# Winform DataGridView 设置DefaultCellStyle无效的原因与解决方案
下一篇:实现winform DataGridView控件判断滚动条是否滚动到当前已加载的数据行底部

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年03月30日 08时45分04秒