【发布时间】:2016-10-05 02:06:47
【问题描述】:
我正在使用存储库模式做一个 MVC 项目,并且我有一个核心写入存储库,如下所示
public abstract class WriteRepository<TContext> : IWriteRepository
where TContext : DbContext, new()
{
private readonly TContext _context;
protected TContext Context { get { return _context; } }
protected WriteRepository()
{
_context = new TContext();
}
public TItem Update<TItem>(TItem item, bool saveImmediately = true) where TItem : class, new()
{
return PerformAction(item, EntityState.Modified, saveImmediately);
}
public TItem Delete<TItem>(TItem item, bool saveImmediately = true) where TItem : class, new()
{
return PerformAction(item, EntityState.Deleted, saveImmediately);
}
public TItem Insert<TItem>(TItem item, bool saveImmediately = true) where TItem : class, new()
{
return PerformAction(item, EntityState.Added, saveImmediately);
}
public void Save()
{
_context.SaveChanges();
}
protected virtual TItem PerformAction<TItem>(TItem item, EntityState entityState, bool saveImmediately = true) where TItem : class, new()
{
_context.Entry(item).State = entityState;
if (saveImmediately)
{
_context.SaveChanges();
}
return item;
}
public void Dispose()
{
_context.Dispose();
}
}
我想在我的数据库中更新一个操作方法的单个字段,我正在做一个 get all,然后我可以像下面这样更新那个值
public ActionResult UpdateTenant(string id)
{
Tenant model = new Tenant();
model = _TenantServices.GetItemById(Guid.Parse(id));
model.IsLoginEnabled = true;
_TenantServices.Update(model);
return RedirectToAction("ViewDetails", new { id = model.TenantId });
}
当我这样做时,我收到一条错误消息“ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。”强>
我正在使用 AsNoTracking 检索数据,如下所示
public Tenant GetItemById(Guid id)
{
return Context.Tenants.AsNoTracking().Where(t => t.TenantId == id).FirstOrDefault();
}
任何想法我该如何解决这个问题?
【问题讨论】:
-
@HenkHolterman 我在这条线上遇到错误 _context.Entry(item).State = entityState;我是否应该将其分配给 var model = _TenantServices.GetItemById(Guid.Parse(id)); ?
-
@HenkHolterman 问题出在我的 Tenant Repository 类上,正如你所说,我发布的代码没有任何问题。
标签: c# asp.net-mvc entity-framework repository-pattern asp.net-mvc-5