首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ObjectContext未处置

ObjectContext未处置
EN

Stack Overflow用户
提问于 2016-04-13 19:26:33
回答 3查看 259关注 0票数 1

我在实体框架6中遇到了一个问题,在那里总是会抛出异常。在大多数情况下,应用程序的工作非常正常,直到我尝试通过链接表将用户添加到角色。

引发的错误如下:

不能定义这两个对象之间的关系,因为它们连接到不同的ObjectContext对象。

该功能将高兴地将用户添加到角色中,但一旦SaveChanges()被调用,流程就会结束。

我知道上述错误的原因和原因,在做了一些研究后,这是由于上下文没有被正确地处理。因此,从这一点出发,查看DbContext设置,我意识到IDisposable没有添加到配置中。不幸的是,无论我尝试在应用程序中的任何一点上合并IDisposable,仍然没有正确地处理上下文。

因此,在花了相当长的时间,并没有运气通过谷歌,我想知道,如果你们有一个解决方案,或能够指出我在正确的方向。

下面是我实现的数据层类的缩减版本:

代码语言:javascript
复制
public class GenericRepository<T> : WebsiteContext, IGenericRepository<T> where T : class
{
    public virtual void Commit()
    {
        SaveChanges();
    }

    public virtual void Delete(int id)
    {
        var record = Set<T>().Find(id);
        if (record == null)
            throw new Exception("Some Message");

        Set<T>().Remove(record);
    }

    // ... ETC
}

public interface IGenericRepository<T> where T : class
{
    void Commit();
    // ... ETC
}

public class WebsiteContext : DbContext, IWebsiteContext
{
    static WebsiteContext()
    {
        Database.SetInitializer<WebsiteContext>(null);
    }

    public WebsiteContext() : base("Name=WebsiteContext") { }

    public IDbSet<User> Users { get; set; }
    // ... ETC

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // ... ETC
    }
}

此实现基于以下堆栈溢出问题。

Entity Framework 6 Code First - Is Repository Implementation a Good One?

下面是导致此问题的Service类和方法的浓缩版本。

代码语言:javascript
复制
    private IGenericRepository<User> _userRepository;
    private IGenericRepository<ApplicationUserSetting> _userSettingRepository;
    private IGenericRepository<ApplicationRole> _roleRepository;

    public UserManagementService()
    {
        _userRepository = new GenericRepository<User>();
        _roleRepository = new GenericRepository<ApplicationRole>();
        _userSettingRepository = new GenericRepository<ApplicationUserSetting>();
    }

    public void AssignUserRole(AssignRoleModel model)
    {
        var user = _userRepository.GetById(model.UserId);

        if (user == null)
            return;

        var role = _roleRepository.GetById(model.RoleId);

        if (role == null)
            return;

        user.Roles.Add(role);
        _userRepository.Commit();
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-13 19:44:35

问题,就像错误状态一样,是因为有多个DbContext类型的实例为您获取实体。然后,每个获取的实体都与检索它的DbContext实例相关联。如果要持久化对这些实体的更改,则必须在与其关联的DbContext实例上发生或必须将其附加到与其无关的DbContext实例。

如果您想保持简单,我建议您实现一个像AutoFac这样的DI框架。然后,您可以在每个请求中创建一个DbContext实例,并将其注入到您需要的任何地方。它将允许您保留现有结构(我不打算对此进行评论,因为我认为这超出了这个问题的范围),最终的结果是每个注入的GenericRepository实例都有一个注入的WebsiteContext实例,但是WebsiteContext实例是共享的(所有相同的实例)。这样做的好处不是更多的错误,但缺点是您必须意识到,对任何实体的任何更改一旦执行Save功能,都会导致这些更改被持久化。

票数 1
EN

Stack Overflow用户

发布于 2016-04-13 19:32:08

使用多个存储库会导致问题。只需使用一个存储库(=一个db上下文),并有不同的方法来获取各个类型。

例如_repository.Get(id)

票数 0
EN

Stack Overflow用户

发布于 2016-04-13 20:21:05

指出如何使当前的实现工作是超出了范围的,但是如果您确实想使用多个上下文,那么尽管其他人已经说过了,您还是可以使用。

如果您这样做了,则必须首先从前面的上下文中提取detach the entity

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36607815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档