我在实体框架6中遇到了一个问题,在那里总是会抛出异常。在大多数情况下,应用程序的工作非常正常,直到我尝试通过链接表将用户添加到角色。
引发的错误如下:
不能定义这两个对象之间的关系,因为它们连接到不同的ObjectContext对象。
该功能将高兴地将用户添加到角色中,但一旦SaveChanges()被调用,流程就会结束。
我知道上述错误的原因和原因,在做了一些研究后,这是由于上下文没有被正确地处理。因此,从这一点出发,查看DbContext设置,我意识到IDisposable没有添加到配置中。不幸的是,无论我尝试在应用程序中的任何一点上合并IDisposable,仍然没有正确地处理上下文。
因此,在花了相当长的时间,并没有运气通过谷歌,我想知道,如果你们有一个解决方案,或能够指出我在正确的方向。
下面是我实现的数据层类的缩减版本:
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类和方法的浓缩版本。
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();
}发布于 2016-04-13 19:44:35
问题,就像错误状态一样,是因为有多个DbContext类型的实例为您获取实体。然后,每个获取的实体都与检索它的DbContext实例相关联。如果要持久化对这些实体的更改,则必须在与其关联的DbContext实例上发生或必须将其附加到与其无关的DbContext实例。
如果您想保持简单,我建议您实现一个像AutoFac这样的DI框架。然后,您可以在每个请求中创建一个DbContext实例,并将其注入到您需要的任何地方。它将允许您保留现有结构(我不打算对此进行评论,因为我认为这超出了这个问题的范围),最终的结果是每个注入的GenericRepository实例都有一个注入的WebsiteContext实例,但是WebsiteContext实例是共享的(所有相同的实例)。这样做的好处不是更多的错误,但缺点是您必须意识到,对任何实体的任何更改一旦执行Save功能,都会导致这些更改被持久化。
发布于 2016-04-13 19:32:08
使用多个存储库会导致问题。只需使用一个存储库(=一个db上下文),并有不同的方法来获取各个类型。
例如_repository.Get(id)
发布于 2016-04-13 20:21:05
指出如何使当前的实现工作是超出了范围的,但是如果您确实想使用多个上下文,那么尽管其他人已经说过了,您还是可以使用。
如果您这样做了,则必须首先从前面的上下文中提取detach the entity。
https://stackoverflow.com/questions/36607815
复制相似问题