实体框架6不检测继承

时间:2017-11-14 02:45:14

标签: c# entity-framework entity-framework-6

我有以下课程设置

 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

1 个答案:

答案 0 :(得分:1)

EF 6无法映射CLR泛型类型。 (抱歉,我现在无法找到这方面的权威参考。)这是问题,而不是一般的继承问题。当EF遍历你的继承&#34;树时,&#34;它到达SearchCondition<,>并放弃。

找到解决这个问题的方法可能需要重新思考对象模型,使其更符合序列化。有没有办法可以将对象模型拆分成一组服务(可能包含泛型),与一组更容易映射的DTO交互?

另一个(可能的,未经测试的)选项:创建一个ISearchElement映射的接口。 SearchPackage应该直接实现它。通过这种方式,SearchPackage - 以及其他SearchCondition<,>实施者应该获得&#34;通过EF继承遍历。