Bri*_*van 62 entity-framework code-first
我想知道为什么DbContext对象上没有Detach方法,就像ObjectContext一样.我只能假设这个遗漏是故意的,但我很难弄清楚原因.我需要能够分离和重新附加实体(例如,在ASP.NET项目中放入缓存).但是,由于我无法分离实体,当我尝试附加与先前上下文关联的实体时,我得到"实体对象不能被IEntityChangeTracker的多个实例引用"异常.
这是什么指导?我错过了什么吗?
Joa*_*kim 85
对于可能偶然发现这个问题的人,从CTP5开始,你现在需要写
((IObjectContextAdapter)context).ObjectContext
为了获得ObjectContext.
Mor*_*avi 37
DbContext在内部使用ObjectContext,EF团队将其作为受保护的属性提供,以防您需要下拉到较低级别的API并且听起来像这样的情况,因此您可以使用或公开派生所需的功能的DbContext:
public class YourContext : DbContext 
{
    public void Detach(object entity) 
    {
        ObjectContext.Detach(entity);            
    }
}
然后,您可以从控制器调用此方法来分离实体.
或者,您可以将其更改为甚至拥有更丰富的API:
public class YourContext : DbContext
{
    public void ChangeObjectState(object entity, EntityState entityState)
    {
        ObjectContext.ObjectStateManager.ChangeObjectState(entity, entityState);
    }
}
以下是DbContext从元数据中的样子:
public class DbContext : IDisposable 
{      
    protected System.Data.Objects.ObjectContext ObjectContext { get; }
    ...
}
Jan*_* K. 16
EF:CF 4.1 RC1和EF:CF 4.1 RTW具有相同的显式实现的IObjectContextAdapter:
public static class DbContextExtensions
{
    public static void Detach(this System.Data.Entity.DbContext context, object entity)
    {
         ((System.Data.Entity.Infrastructure.IObjectContextAdapter)context).ObjectContext.Detach(entity);
    }
}
微软决定"Detach是太先进的技术,应该被隐藏".恕我直言,发明这个的男人应该被拍摄 - 因为如果你添加全新的实体,否则很难在不改变db的情况下删除它(你可以使用DbEntityEntry进行操作,但这是另一个故事).
随着EF6(我不知何故跳过EF5 :))你detach()不再需要了,因为删除新的添加条目不会delete from [table] where [Id] = 0像EF4 中那样生成- 你可以打电话mySet.Remove(myFreshlyCreatedAndAddedEntity),一切都会好的.
我通常使用属性扩展基类(继承自DbContext):
public class MyDbContext : DbContext
{
    public ObjectContext ThisObjectContext
    {
        get
        {
            return ((IObjectContextAdapter)this).ObjectContext;
        }
    }
}
以后你可以使用这个属性的各种有用的东西...像分离:)
| 归档时间: | 
 | 
| 查看次数: | 28733 次 | 
| 最近记录: |