EF Core fluent映射到内部对象属性

cdi*_*die 5 c# fluent-entity-framework entity-framework-core

我有一个包含一些属性的类.出于某些架构原因,我在我的班级中有另一个对象的实例.

简单的例子

public class MyEntity {
   public MySubEntity SubEntity {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

为此,我创建了流畅的映射,如:

builder.ToTable(MyEntity.CONST_TABLE_NAME);
builder.HasKey(m => m.Id);
builder.Property(m => m.Column1).IsRequired();
builder.Property(m => m.SubEntity.Column2).IsRequired();
Run Code Online (Sandbox Code Playgroud)

我无法将所有subEntity属性集成到我的主实体中(我的subEntity有自己的智能).我只想将我的子实体属性(不存储在单独的表中)映射到myEntity表.

最后一行抛出异常:

The expression 'm => m.SubEntity.Column2' is not a valid property expression. The expression should represent a property access: 't => t.MyProperty'.
Run Code Online (Sandbox Code Playgroud)

我该如何进行这种映射?

cdi*_*die 3

EF Core 目前不支持此类映射。EF Core 1.0 RTM 不支持它(请参阅我的 github 问题: https: //github.com/aspnet/Home/issues/1330

正如我在 github 问题中所述,我找到了 2 个解决方案:

1)从我的模型创建一个专门为EF设计的派生类,并以简单的方式公开所有属性。当插入/更新和从数据库检索时,它将需要更多映射。我们不选择这个选项

2) 创建代理属性。在我的示例中,这就像:

public class MyEntity {
   private MySubEntity SubEntity {get; set;}
   public string SubEntityValue 
   { 
     get 
     { 
         return SubEntity.Value;
     } 
     set 
     { 
         SubEntity.Value = value; 
     }
}
Run Code Online (Sandbox Code Playgroud)

这似乎是最好的解决方案(我们选择这个)。