簡體   English   中英

存儲庫模式通用寫存儲庫問題-對象狀態管理器問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM