EF Core 流畅映射到内部对象属性
EF Core fluent mapping to inner object properties
我有一个包含一些属性的 class。
由于某些架构原因,我在 class.
中有另一个对象的实例
简单示例
public class MyEntity {
public MySubEntity SubEntity {get; set;}
}
为此,我创建了流畅的映射,例如:
builder.ToTable(MyEntity.CONST_TABLE_NAME);
builder.HasKey(m => m.Id);
builder.Property(m => m.Column1).IsRequired();
builder.Property(m => m.SubEntity.Column2).IsRequired();
我无法将我所有的子实体属性集成到我的主实体中(我的子实体有自己的智能)。我只想将我的子实体属性(未存储在单独的 table 中)映射到 myEntity table.
最后一行抛出异常:
The expression 'm => m.SubEntity.Column2' is not a valid property expression. The expression should represent a property access: 't => t.MyProperty'.
如何执行此类映射?
EF Core 目前不支持这种类型的映射。它在 EF Core 1.0 RTM 中不受支持(请参阅我的 github 问题:https://github.com/aspnet/Home/issues/1330)
正如我在 github 问题中所述,我找到了 2 个解决方案:
1) 从我的模型创建一个派生的 class,专为 EF 设计,并将所有属性公开为简单。当 insert/update 并从 Db 检索时,它将需要更多映射。我们不选择这个选项
2) 创建代理属性。在我的例子中,这就像:
public class MyEntity {
private MySubEntity SubEntity {get; set;}
public string SubEntityValue
{
get
{
return SubEntity.Value;
}
set
{
SubEntity.Value = value;
}
}
这似乎是最好的解决方案(我们选择这个)。
我有一个包含一些属性的 class。 由于某些架构原因,我在 class.
中有另一个对象的实例简单示例
public class MyEntity {
public MySubEntity SubEntity {get; set;}
}
为此,我创建了流畅的映射,例如:
builder.ToTable(MyEntity.CONST_TABLE_NAME);
builder.HasKey(m => m.Id);
builder.Property(m => m.Column1).IsRequired();
builder.Property(m => m.SubEntity.Column2).IsRequired();
我无法将我所有的子实体属性集成到我的主实体中(我的子实体有自己的智能)。我只想将我的子实体属性(未存储在单独的 table 中)映射到 myEntity table.
最后一行抛出异常:
The expression 'm => m.SubEntity.Column2' is not a valid property expression. The expression should represent a property access: 't => t.MyProperty'.
如何执行此类映射?
EF Core 目前不支持这种类型的映射。它在 EF Core 1.0 RTM 中不受支持(请参阅我的 github 问题:https://github.com/aspnet/Home/issues/1330)
正如我在 github 问题中所述,我找到了 2 个解决方案:
1) 从我的模型创建一个派生的 class,专为 EF 设计,并将所有属性公开为简单。当 insert/update 并从 Db 检索时,它将需要更多映射。我们不选择这个选项
2) 创建代理属性。在我的例子中,这就像:
public class MyEntity {
private MySubEntity SubEntity {get; set;}
public string SubEntityValue
{
get
{
return SubEntity.Value;
}
set
{
SubEntity.Value = value;
}
}
这似乎是最好的解决方案(我们选择这个)。