EF4无法将具体类型转换为接口

Nic*_*yle 5 .net polymorphism linq-to-entities entity-framework-4

使用实体框架LINQ,我想为每个父表返回一个父类,并在父类上使用接口的多个具体实现之一填充其类型为接口的属性.应根据父表中字段的值在查询时确定哪个具体实现.

在一个非常简单的例子中,我有3个表和3个相应的POCO.

简单的表格,例如

三张桌子:主人和两个孩子

简单的类为了举例

internal interface IConfiguration
{
}

internal class ConfigurationContainer
{
    public IConfiguration Config { get; set; }
}

internal class ConfigurationSouth : IConfiguration
{
}

internal class ConfigurationNorth : IConfiguration
{
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我循环遍历所有父结果并确定在循环内使用哪个子查询.事情这个块.

foreach (var configMaster in db.ConfigMasters.ToList())
{
    var configContainer = new ConfigurationContainer();
    if (configMaster.IsNorth)
        configContainer.Config = (from x in db.ConfigNorths
                          select new ConfigurationNorth())
                                      .FirstOrDefault();
    else
        configContainer.Config = (from x in db.ConfigSouths
                          select new ConfigurationSouth())
                                      .FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)

循环遍历每个父记录以执行子查询不是最佳的.我真的很喜欢EF LINQ在一次数据库中执行查询以及对我的POCO进行预测.

我想出了这个LINQ来一次查询数据库并返回投影对象,以便在查询时由两个子查询中的一个填充Config属性.虽然它编译,但它会在运行时抛出异常.

using (var db = new Entities())
{
    var qry = from cfgMaster in db.ConfigMasters
                let configNorth = (from x in db.ConfigNorths
                                    select new ConfigurationNorth())
                    .FirstOrDefault()
                let configSouth = (from x in db.ConfigSouths
                                    select new ConfigurationSouth())
                    .FirstOrDefault()
                select new ConfigurationContainer()
                    {
                        Config = cfgMaster.IsNorth ? configNorth : (IConfiguration) configSouth
                    };

    var results = qry.ToList();
}
Run Code Online (Sandbox Code Playgroud)

例外

未处理的异常:System.NotSupportedException:无法将类型'EFTest.ConfigurationNorth'强制转换为'EFTest.IConfiguration'.LINQ to Entities仅支持转换实体数据模型基元类型.

Ger*_*old 1

实体框架(还?)不支持以这种方式使用接口,主要是因为接口没有(也不能)在模型中注册。只有当您让这两个类都从也是模型一部分的基类派生时,您想要的才有可能。