簡體   English   中英

如何告訴Entity Framework僅保存特定DbSet的更改?

[英]How can I tell Entity Framework to save changes only for a specific DbSet?

假設我在單個DbContext中修改來自不同DbSets的實體。

在調用SaveChanges()時,如何保存Entity Framework以僅保存特定DbSet的更改?

理想情況下,您要做的只是修改要更改的實體,然后調用SaveChanges()然后修改其他實體。 但是,如果這是不可能的,我會添加一個看起來像這樣的SaveChanges()的重載。

public int SaveChanges<TEntity>() where TEntity : class
{
    var original = this.ChangeTracker.Entries()
                .Where(x => !typeof(TEntity).IsAssignableFrom(x.Entity.GetType()) && x.State != EntityState.Unchanged)
                .GroupBy(x => x.State)
                .ToList();

    foreach(var entry in this.ChangeTracker.Entries().Where(x => !typeof(TEntity).IsAssignableFrom(x.Entity.GetType())))
    {
        entry.State = EntityState.Unchanged;
    }

    var rows = base.SaveChanges();

    foreach(var state in original)
    {
        foreach(var entry in state)
        {
            entry.State = state.Key;
        }
    }

    return rows;
}

最初,您會找到狀態未更改的所有實體並保存其條目。 然后設置不屬於您的TEntity類型的每個實體的狀態,並將其狀態設置為不變。 然后調用base.SaveChanges()以保存對您的類型實體的所有更改。

然后,通過循環保存的條目,您可以將其原始狀態重置為它們。 這樣,您將捕獲所有不屬於您的類型的添加/更新/刪除,並將其還原,以便下次調用SaveChanges()不會丟失其更改。

在使用下面的代碼之前,您應該知道是否只想保存一組特定的實體,這意味着您應該為您的工作單元使用不同的db上下文實例。

但是使用此代碼可以拒絕除YourSpecialEntity之外的所有實體的YourSpecialEntity

db.ChangeTracker.Entries()
                .Where(x => x.State == EntityState.Modified &&
                            !typeof(YourSpecialEntity).IsAssignableFrom(x.Entity.GetType()))
                .ToList()
                .ForEach(entry => {
                    entry.CurrentValues.SetValues(entry.OriginalValues);
                });

db.SaveChanges();

我想db是dbcontext的一個實例。

我是EF的新手,我遇到了同樣的問題。 在我的存儲程序中,例如,只將sumId和OwnerId匯總為一個新股票,因為我認為我的mvc表格中不需要隱藏字段。 起初EF在文章和客戶數據庫中創建了新條目,但我只想在庫存表中插入一個新項目。 因此解決方案非常簡單:對於您知道不想保存的所有實體,請鍵入以下內容:

           //prevent Owner to be saved (again)
            db.Entry(stockItem.Owner).State = EntityState.Unchanged;

          //prevent article to be saved (again)  
           db.Entry(stockItem.ArticleItem).State = EntityState.Unchanged;

            db.Stocks.Add(stockItem);

           //now just the properties (-> dbset of the stockItem get´s saved)
            await db.SaveChangesAsync();
            return RedirectToAction("Index");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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