在 Entity Framework Core 3.1 中使用投影时不会跟踪更改
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;
If the result set contains entity types coming out from LINQ composition, EF Core will track them.
来源
https://docs.microsoft.com/en-us/ef/core/querying/tracking
为什么在使用投影时未跟踪更改?
因为他们不跟踪他们。这在 3.1 中被禁用,其中项目自动添加 AsNoTracking。
许多许多无法真正解释并使 EfCore 3.1 成为无法与 Ef 6.4 竞争的产品的决定中的一个。
通知"entity types":
If the result set contains entity types coming out from LINQ
composition, EF Core will track them.
来自相同的文档:
If the result set doesn't contain any entity types, then no tracking
is done.
您的投影不包含实体类型,因此不会跟踪更改。
例如,如果您将引入 属性 来保留 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
有预测(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;
If the result set contains entity types coming out from LINQ composition, EF Core will track them.
来源
https://docs.microsoft.com/en-us/ef/core/querying/tracking
为什么在使用投影时未跟踪更改?
因为他们不跟踪他们。这在 3.1 中被禁用,其中项目自动添加 AsNoTracking。
许多许多无法真正解释并使 EfCore 3.1 成为无法与 Ef 6.4 竞争的产品的决定中的一个。
通知"entity types":
If the result set contains entity types coming out from LINQ composition, EF Core will track them.
来自相同的文档:
If the result set doesn't contain any entity types, then no tracking is done.
您的投影不包含实体类型,因此不会跟踪更改。
例如,如果您将引入 属性 来保留 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