.net EF4无法将混凝土类型浇注到接口

.net EF4无法将混凝土类型浇注到接口,.net,entity-framework-4,linq-to-entities,polymorphism,.net,Entity Framework 4,Linq To Entities,Polymorphism,使用实体框架LINQ,我希望为每个父表返回一个父类,并使用接口的多个具体实现之一在父类上填充一个属性(其类型为接口)。应在查询时根据父表中字段的值确定哪个具体实现 在一个非常简化的示例中,我有3个表和3个相应的POCO 为了举例,简单的表格 internal interface IConfiguration { } internal class ConfigurationContainer { public IConfiguration Config { get; set; } }

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

在一个非常简化的示例中,我有3个表和3个相应的POCO

为了举例,简单的表格

internal interface IConfiguration
{
}

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

internal class ConfigurationSouth : IConfiguration
{
}

internal class ConfigurationNorth : IConfiguration
{
}

为了举例而简单的类

internal interface IConfiguration
{
}

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

internal class ConfigurationSouth : IConfiguration
{
}

internal class ConfigurationNorth : IConfiguration
{
}
不幸的是,我循环了所有的父结果,并确定在循环中使用哪个子查询。像这个街区一样的东西

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();
}
在每个父记录之间循环以执行子查询不是最佳的。我真的希望EF LINQ在数据库的一次访问中执行查询,并将其投影到我的POCO中

我使用这个LINQ在一次访问中查询数据库并返回投影对象,这样Config属性将在querytime由两个子查询中的一个子查询填充。虽然它可以编译,但在运行时会抛出异常

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();
}
例外情况

未处理的异常:System.NotSupportedException:无法强制转换 键入“EFTest.ConfigurationNorth”以键入“EFTest.IConfiguration”。林克 “到实体”仅支持转换实体数据模型基元类型


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

只有当您让两个类都从属于模型一部分的基类派生时,才能实现此功能。:(不幸的是,您似乎是对的。如果您将此作为答案发布,我将接受它。