2
我有它有其自身的集合,并且我想成为空父母财产,如果它是根插件的下列实体:EF 6流利的配置 - 递归嵌套对象与母公司 - TPH
public class CanvasWidgetQuery
{
public int CanvasWidgetId { get; set; }
public int? ParentCanvasWidgetId { get; set; }
public virtual CanvasWidgetQuery ParentCanvasWidget { get; set; }
public virtual ICollection<CanvasWidgetQuery> InnerCanvasWidgets { get; set; }
}
因为CanvasWidgetQuery
实际上只是一个基类(可能是抽象的,但我没有抽象,直到我看到它没有它时才起作用)。我想创建一个通用的映射配置映射派生类型的CanvasWidgetQuery
:
public class CanvasWidgetQueryMap<TCanvasWidgetQuery> : EntityTypeConfiguration<TCanvasWidgetQuery>
where TCanvasWidgetQuery : CanvasWidgetQuery
{
public CanvasWidgetQueryMap()
{
this.HasKey(q => q.CanvasWidgetId);
this.HasMany(w => w.InnerCanvasWidgets)
.WithOptional(w => w.ParentCanvasWidget)
.HasForeignKey(w => w.ParentCanvasWidgetId);
}
}
无论派生类型,它们都具有这些属性,但不幸的是它抱怨的WithOptional
调用(一次2个错误):
Error 1 Cannot implicitly convert type 'CanvasWidgetQuery' to 'TCanvasWidgetQuery'. An explicit conversion exists (are you missing a cast?)
Error 2 Cannot convert lambda expression to delegate type 'System.Func<CanvasWidgetQuery,TCanvasWidgetQuery>' because some of the return types in the block are not implicitly convertible to the delegate return type
如果我提出这样一个水平,以实际派生类型的映射:
public class SearchCanvasWidgetQueryMap : CanvasWidgetQueryMap<SearchCanvasWidgetQuery>
{
public SearchCanvasWidgetQueryMap()
{
this.HasMany(w => w.InnerCanvasWidgets)
.WithOptional(w => w.ParentCanvasWidget)
.HasForeignKey(w => w.ParentCanvasWidgetId);
}
}
现在抱怨说,它可以不含蓄转换成CanvasWidgetQuery
同时SearchCanvasWidgetQuery
:
public class SearchCanvasWidgetQuery : CanvasWidgetQuery
{
}
我怎么能做到什么,我以后
谢谢,这正是我最终的解决方法。但是我越多思考它越有意义,为什么EF中的继承不应该使用BaseEntityTypeConfiguration类在应用程序级建模,因为配置常见基本属性(如CanvasWidgetId)的方式基于继承策略(TPT,TPC,或TPH)而不是配置类的构造函数调用的顺序 – parliament
有趣的一点是,这促使我去阅读更多关于EF继承策略的内容,因为我只需要在非常简单的情况下使用EF继承。 = d – Chris