我有以下课程设置
public abstract class SearchElement
{
public int Id { get; set; }
public SearchElement parent { get; set; }
public int Order { get; set; }
public UserQuery UserQuery { get; set; }
}
public class SearchGroup : SearchElement
{
public virtual ICollection<SearchElement> SearchObjects { get; set; }
public bool IsAndOperator { get; set; }
public SearchGroup()
{
this.SearchObjects = new List<SearchElement>();
}
}
public abstract class SearchCondition<IContext, OutputType> : SearchElement
{
public ComparisonTypes Comparison { get; set; }
public string Value { get; set; }
public abstract Expression<Func<OutputType, bool>> BuildConditionQuery(IContext context);
}
public class SearchPackage : SearchCondition<ISearchContext, ProjectParticipantQuestionnaireResponseGroup>
{
public override System.Linq.Expressions.Expression<Func<ProjectParticipantQuestionnaireResponseGroup, bool>> BuildConditionQuery(ISearchContext context)
{
return this.BuildCondition<ProjectParticipantQuestionnaireResponseGroup, int>(r => r.Package.Id, int.Parse(this.Value), this.Comparison);
}
}
现在出于某种原因,在EntityFramework上下文中我指定:
public DbSet<SearchElement> SearchElements { get; set; }
检测到SearchGroup类,并在SearchElement表中创建相应的字段。但是,SearchPackage类未被检测到,并且它的字段不会在SearchElement表中创建。
我当然可以为SearchPackage创建一个DbSet,但是有多个类似的类(相同的继承,尽管有些具有不同的值),我不想为每个类创建一个DbSet。有没有人对我能做什么有什么建议?
为清楚起见:我使用的是Entity Framework 6.1.3和C#4.5.1
答案 0 :(得分:1)
EF 6无法映射CLR泛型类型。 (抱歉,我现在无法找到这方面的权威参考。)这是问题,而不是一般的继承问题。当EF遍历你的继承&#34;树时,&#34;它到达SearchCondition<,>
并放弃。
找到解决这个问题的方法可能需要重新思考对象模型,使其更符合序列化。有没有办法可以将对象模型拆分成一组服务(可能包含泛型),与一组更容易映射的DTO交互?
另一个(可能的,未经测试的)选项:创建一个 ISearchElement
映射的接口。 SearchPackage
应该直接实现它。通过这种方式,SearchPackage
- 以及其他SearchCondition<,>
实施者应该获得&#34;通过EF继承遍历。