【发布时间】:2021-01-01 01:19:24
【问题描述】:
我有以下课程:
public class Vehicle{
public Engine TurboV6 { get; set; }
public class Engine{
public Cylinder Core { get; set; }
public class Cylinder{
public double? Capacity { get; set; }
并且我在OnModelCreating方法中配置了拥有的实体如下:
modelBuilder.Entity<Vehicle>()
.OwnsOne(
v => v.TurboV6, e=> {
e.OwnsOne(e => e.Core);
});
问题
当我尝试在 v.TurboV6.Core = null; 等拥有的实体中保存空值时,EF Core 不会将 Vehicle.TurboV6.Core.Capacity 中的空值保存为空值,而是将之前的值保留在数据库中。我认为这是由 EF Core 的更改跟踪中的问题引起的。
我试图通过以下方式克服这个问题:
vContext = DbContext.Vehicles.Add(new Vehicle());
vContext.Property(v => v.TurboV6.Core.Capacity).IsModified = true;
注意vContext 是EntityEntry<Vehicle> 类型,而不是DbContext。
类似这个问题:Nested navigation properties using entity entry reference ,
当我访问下面的代码时:
vContext.Property(v => v.TurboV6.Core.Capacity).IsModified = true;
我收到一条错误消息说
System.ArgumentException:表达式“v => v.TurboV6.Core.Capacity”不是有效的属性表达式。该表达式应该表示一个简单的属性访问:'t => t.MyProperty'。 (参数'propertyAccessExpression')
我使用的是 EF Core 2.2.6
是否可以像上面那样映射链式属性?我错过了什么吗? 如果是,我该怎么做?
谢谢
【问题讨论】:
-
您能否获取/使用
EntityEntry<Capacity>,然后根据需要使用.Property()方法? -
为什么不使用经典的 FK 代码优先方法?
-
DbContext doesn't have a Property() method。你为什么要使用
vContext.Property(v => v.TurboV6.Core.Capacity)而不是使用对象? -
@Progman,我只能访问
EntityEntry<Vehicle>。我如何获得EntityEntry<Capacity>? -
@hunterex 您是否为这些实体禁用了更改跟踪器?如果是这样,为什么?请edit您的问题更详细地描述您的问题以及您正在尝试做什么。听起来像是 XY 问题。
标签: c# .net-core entity-framework-core ef-core-2.2