[英]Repository pattern Generic Write Repository issue - Object State Manager Issue
我正在使用存儲庫模式進行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();
}
}
我想在一個操作方法上更新數據庫中的單個字段,並且在可以像下面這樣更新該值之前,我已經做了一個獲取全部操作
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();
}
任何想法我該如何解決呢?
每當您從數據庫檢索對象時,Entity Framework就會立即開始跟蹤(附加)對象。 您將能夠對檢索到的對象進行更改(即,設置屬性值)並調用SaveChanges()
以便無需在數據庫中設置EntityState
即可更新數據庫中的對象。
實際上,如果您嘗試Attach
或設置已跟蹤對象的EntityState
,則會收到上面提到的錯誤。
因此,要解決該錯誤,您可以:
TContext
一個實例進行檢索,並使用另一個實例進行更新。 在這種情況下,您應該在update方法中附加並設置EntityState
,以使更改保持不變。 TContext
的單個實例來檢索和更新,但不要再嘗試Attach
或設置EntityState
了。 設置屬性值后,直接調用SaveChanges
。 TContext
的單個實例,但是在檢索記錄時,可以調用AsNoTracking()
。 這將允許您在更新期間安全地Attach
或設置EntityState
。 希望能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.