Entity framework 4 EF 4.3.1代码中的映射继承层次结构总是首先使用映射方法失败

Entity framework 4 EF 4.3.1代码中的映射继承层次结构总是首先使用映射方法失败,entity-framework-4,ef-code-first,Entity Framework 4,Ef Code First,从Julia Lerman的EF代码第一本书中的示例开始的简单测试项目。当使用Map方法时,没有一个示例可以在TPH、TPT或TPC中工作,但是没有任何示例可以工作。EF的所有其他方面(我有一个部分开发的应用程序)似乎都可以正常工作。我正在使用VS 2010/.NET 4和所有最新的更新,今天我甚至求助于修复VS安装 下面的TPH示例引发InvalidOperationException-“对类型“Child”调用了多次映射,并且至少有一个调用没有指定目标表名。” 使用System.Linq;

从Julia Lerman的EF代码第一本书中的示例开始的简单测试项目。当使用Map方法时,没有一个示例可以在TPH、TPT或TPC中工作,但是没有任何示例可以工作。EF的所有其他方面(我有一个部分开发的应用程序)似乎都可以正常工作。我正在使用VS 2010/.NET 4和所有最新的更新,今天我甚至求助于修复VS安装

下面的TPH示例引发InvalidOperationException-“对类型“Child”调用了多次映射,并且至少有一个调用没有指定目标表名。”

使用System.Linq;
使用System.Data.Entity;
命名空间控制台应用程序1
{
公共课程
{
静态void Main(字符串[]参数)
{
SetInitializer(新的DropCreateDatabaseIfModelChanges());
var children=newcontext().Set().ToList();
}
}
公共类父类
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
公共类子级:父级
{
}
公共类上下文:DbContext
{
DbSet父项{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Map(m=>
{
m、 需要(“EntityType”).HasValue(“父项”);
m、 ToTable(“家庭”);
})
.Map(m=>m.Requires(“EntityType”).HasValue(“Child”);
}
}
}
另一个示例(这次是TPT)抛出“类型'Child'已映射到表'Children'。在单个映射调用中指定表的所有映射方面。”

模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Map(m=>m.ToTable(“系列”))
.Map(m=>m.ToTable(“儿童”);
}
最后一个示例TPC抛出类似的“类型'Child'已映射到表'Children'。在单个映射调用中指定表的所有映射方面。”

模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Map(m=>m.ToTable(“系列”))
.Map(m=>
{
m、 可折叠(“儿童”);
m、 MapInheritedProperties();
});
}
我也尝试过很多其他的例子,都有类似的结果。要么我缺少一些非常基本的东西,要么我怀疑我有安装/配置问题。我的电脑也安装了VS2008,几个月前我重新配置了很多SQL Server,因为我安装了4个不同的版本。我现在使用的是2008 R2 Express

有没有人见过类似的情况,或者知道我如何跟踪/调试EF中发生的事情?

在这里找到了答案。。。

。。。这是4.3和4.3.1中的已知问题。(我们发现在4.3.1中进行修复为时已晚。)

。。。简而言之,在4.1中,您曾经能够对单个EntityConfiguration进行链式映射调用。和4.2

谢天谢地,建议的另一种调用Map(即不链接)的方法解决了我所有的问题

using System.Linq;
using System.Data.Entity;

namespace ConsoleApplication1
{
    public class Program
    {
        static void Main(string[] args)
        {
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<Context>());
            var children = new Context().Set<Child>().ToList();
        }
    }

    public class Parent
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class Child : Parent
    {
    }

    public class Context : DbContext
    {
        DbSet<Parent> Parents { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Parent>()
                .Map(m =>
                    {
                        m.Requires("EntityType").HasValue("Parent");
                        m.ToTable("Families");
                    })
            .Map<Child>(m => m.Requires("EntityType").HasValue("Child"));
        }
    }
}
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Parent>()
                .Map(m => m.ToTable("Families"))
                .Map<Child>(m => m.ToTable("Children"));
        }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Parent>()
                .Map(m => m.ToTable("Families"))
                .Map<Child>(m =>
                    {
                        m.ToTable("Children");
                        m.MapInheritedProperties();
                    });
        }