![](/img/trans.png)
[英]How can I detect changes to properties in a specific entity in Entity Framework Core 2.x?
[英]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.