【问题标题】:Entity Framework 6 doesn't detect inheritanceEntity Framework 6 不检测继承
【发布时间】:2017-11-15 00:44:02
【问题描述】:

我有以下课程设置

 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

【问题讨论】:

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


    【解决方案1】:

    EF 6 无法映射 CLR 泛型类型。 (对不起,我现在找不到权威参考。)这是问题,一般不是继承问题。当 EF 遍历您的继承“树”时,它会到达 SearchCondition&lt;,&gt; 并放弃。

    找到解决此问题的方法可能需要重新考虑您的对象模型,使其更适合序列化。有没有一种方法可以将您的对象模型拆分为一组服务(可能包含泛型),这些服务与一组更容易映射的 DTO 进行交互?

    另一个(可能的,未经测试的)选项:创建一个ISearchElement 映射接口。 SearchPackage 应该直接实现它。这样,SearchPackage--和其他 SearchCondition&lt;,&gt; 实现者应该被 EF 继承遍历“拾取”。

    【讨论】:

    • 感谢您的回复。我可能是错的,但据我所知,EF 不支持接口映射。有没有 Google 没有告诉我的解决方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2014-01-09
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    相关资源
    最近更新 更多