![](/img/trans.png)
[英].Net Core 3.1 - The instance of entity type 'City' cannot be tracked - when using custom Date Tracker
[英]Changes are not tracked when using projections in Entity Framework Core 3.1
有預測(0 次變化):
var changesBefore = Db.ChangeTracker.Entries<OrderLocationEntity>().ToList(); //before change - 0
var orderLocation = Db.OrderLocation.AsTracking().Select(ol => new OrderLocationEntity
{
Id = ol.Id,
Address = ol.Address,
City = ol.City,
Created = ol.Created,
OrderId = ol.OrderId,
Zip = ol.Zip
}).First();
orderLocation.Address = "address";
var changesAfter = Db.ChangeTracker.Entries<OrderLocationEntity>().ToList(); //after change - 0
無投影(1 處更改)
var changesBefore = Db.ChangeTracker.Entries<OrderLocationEntity>().ToList(); //before change - 0
var orderLocation = Db.OrderLocation.AsTracking().First();
orderLocation.Address = "address";
var changesAfter = Db.ChangeTracker.Entries<OrderLocationEntity>().ToList(); //after change - 1
設置
Microsoft.EntityFrameworkCore 3.1.1
Microsoft.EntityFrameworkCore.Sqlite 3.1.1
var options = new DbContextOptionsBuilder<OrderDatabaseContext>()
.UseSqlite("DataSource=:memory:")
.Options;
如果結果集包含來自 LINQ 組合的實體類型,EF Core 將跟蹤它們。
來源
https://docs.microsoft.com/en-us/ef/core/querying/tracking
為什么在使用投影時沒有跟蹤更改?
注意“實體類型”:
如果結果集包含來自 LINQ 組合的實體類型,EF Core 將跟蹤它們。
來自相同的文檔:
如果結果集不包含任何實體類型,則不進行跟蹤。
您的投影不包含實體類型,因此不會跟蹤更改。
例如,如果您將引入屬性來保留OrderLocationEntity
實例,則該實例將被上下文跟蹤
var location = Db.OrderLocation.AsTracking()
.Select(ol => new OrderLocationEntity
{
Id = ol.Id,
Address = ol.Address,
City = ol.City,
Created = ol.Created,
OrderId = ol.OrderId,
Zip = ol.Zip,
Location = ol // entity instance passed to the projected object
})
.First();
location.Location.Address = "New Address";
Db.ChangeTracker.Entries<OrderLocationEntity>().ToList(); //after change - 1
因為他們不跟蹤他們。 這在 3.1 中被禁用,其中項目自動添加 AsNoTracking。
無法真正解釋並使 EfCore 3.1 成為無法與 Ef 6.4 競爭的產品的眾多決定中的又一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.