【问题标题】:How to access chained/nested property in EF Core 2.2如何访问 EF Core 2.2 中的链式/嵌套属性
【发布时间】: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;

注意vContextEntityEntry&lt;Vehicle&gt; 类型,而不是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&lt;Capacity&gt;,然后根据需要使用.Property() 方法?
  • 为什么不使用经典的 FK 代码优先方法?
  • DbContext doesn't have a Property() method。你为什么要使用 vContext.Property(v =&gt; v.TurboV6.Core.Capacity) 而不是使用对象?
  • @Progman,我只能访问EntityEntry&lt;Vehicle&gt;。我如何获得EntityEntry&lt;Capacity&gt;
  • @hunterex 您是否为这些实体禁用了更改跟踪器?如果是这样,为什么?请edit您的问题更详细地描述您的问题以及您正在尝试做什么。听起来像是 XY 问题。

标签: c# .net-core entity-framework-core ef-core-2.2


【解决方案1】:

TurboV6Core引用导航 属性,因此必须通过Reference 方法访问它们。嵌套实体条目可通过 TargetEntry 属性访问。重复此操作,直到达到可以使用Property 方法的所需级别条目。

类似这样的:

vContext
    .Reference(e => e.TurboV6).TargetEntry
    .Reference(e => e.Core).TargetEntry
    .Property(e => e.Capacity).IsModified = true;

【讨论】:

  • 我不确定这是否能解决真正的问题。 OP 想要将Core 设置为null 并让所有拥有的类型列更改为null。其中应该已经为空,因为vContext 值代表一个新条目
  • 我已经编辑了问题以尝试使其可读,它看起来像一个 XYZ 问题 - OP 尝试使用默认值创建列 并仍然存储 null默认给他们。那就是 Y——不知道是什么 X 导致了这样的设计。当这不起作用时(因为新实体中的属性已经为 NULL),OP 尝试将属性显式标记为 Modified。那是Z,它也失败了。还是那是 XYZZ1?
  • @PanagiotisKanavos 可能是,我没有点击链接,所以这回答了直接问题“如何访问 EF Core 2.2 中的链式/嵌套属性”和vContext.Property(v =&gt; v.TurboV6.Core.Capacity).IsModified = true;。如果真正的问题不同,那么他们必须提出不同的问题。
  • 就像向客户询问真正的要求
  • @PanagiotisKanavos 哈哈,确实!
猜你喜欢
  • 2017-11-27
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 2019-07-20
相关资源
最近更新 更多