C# 类型未映射实体框架5.0

C# 类型未映射实体框架5.0,c#,entity-framework,entity-framework-5,C#,Entity Framework,Entity Framework 5,我跟着 我尝试按照VS 2012控制台应用程序中的确切步骤操作,请参见下面的代码 class Program { static void Main(string[] args) { using (var context = new EftDbContext()) { context.Blogs.Add(new Blog { Name = "ASP.NET" }); context.SaveChange

我跟着

我尝试按照VS 2012控制台应用程序中的确切步骤操作,请参见下面的代码

class Program
{
    static void Main(string[] args)
    {
        using (var context = new EftDbContext())
        {
            context.Blogs.Add(new Blog { Name = "ASP.NET" });
            context.SaveChanges();

            var blogs = from n in context.Blogs
                        orderby n.Name
                        select n;

            foreach (var b in blogs)
            {
                Console.WriteLine(b);
            }
        }
    }

    public class Blog
    {
        public int BlogId { get; set; }
        public string Name { get; set; }

        public virtual List<Post> Posts { get; set; }
    }

    public class Post
    {
        public int PostId { get; set; }
        public string Title { get; set; }

        public int BlogId { get; set; }
        public virtual Blog Blog { get; set; }
    }

    public class EftDbContext : DbContext
    {
        public EftDbContext()
            : base("name=EftDbContext")
        {

        }
        public DbSet<Post> Posts { get; set; }
        public DbSet<Blog> Blogs { get; set; }
    }
}
类程序
{
静态void Main(字符串[]参数)
{
使用(var context=new EftDbContext())
{
Add(新博客{Name=“ASP.NET”});
SaveChanges();
var blogs=来自context.blogs中的n
订购者姓名
选择n;
foreach(博客中的var b)
{
控制台写入线(b);
}
}
}
公共类博客
{
public int BlogId{get;set;}
公共字符串名称{get;set;}
公共虚拟列表发布{get;set;}
}
公营职位
{
公共int PostId{get;set;}
公共字符串标题{get;set;}
public int BlogId{get;set;}
公共虚拟博客{get;set;}
}
公共类EftDbContext:DbContext
{
公共EftDbContext()
:base(“name=EftDbContext”)
{
}
公共DbSet Posts{get;set;}
公共数据库集博客{get;set;}
}
}
但是,当我运行应用程序时,会出现以下错误:

未映射类型“EntityFrameworkTest.Program+Post”。检查是否未使用Ignore方法或NotMappeAttribute数据批注明确排除该类型。验证该类型是否定义为类、是否为基元、嵌套或泛型,以及是否从EntityObject继承

如果对此处感兴趣的人是我当前的连接字符串(我尝试了多个选项):


我需要在哪里指定映射,更重要的是为什么?EF应该把它捡起来不

我用VS 2012 web API模板创建了另一个项目,但没有显示此错误


更新:

数据库不存在。我还没有第一次在我的机器上成功地执行这个应用程序,以便EF代码首先为我生成数据库。它在EftDbContext构造函数本身中失败


更新2:此问题已解决。问题是我所有的POCO类和DbContext都嵌套在程序类中。英孚不知何故不喜欢它…

以上评论:

Blog和Post类以及dbcontext都在程序类中声明。他们不应该这样


EF5不支持嵌套类型。

应该
:base(“name=EftDbContext”)
不是
:base(“EftDbContext”)
?@MattSull87如果您需要将
name=
保存在那里,我很高兴。数据库已经存在了吗?使用Code first,它将在第一次创建数据库,但我认为您需要使用代码迁移来更新模型,或者只是删除数据库并让EF再次为您创建。似乎Post是一种嵌套类型。EF5不支持嵌套类型。EF6在这方面有一些改进AFAIR@user1529150-嵌套类是指在另一个类中定义的类。Blog和Post类以及dbcontext都在程序类中声明。他们不应该这样。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。请阅读提问者确认这是他们遇到的问题的评论。这是对我之前评论的一条评论,指出它们使用的嵌套类型在EF 5中不受支持,在这种情况下,您可以只使用注释。你提供的答案应该有一些文档和链接来支持它。@Luv-这不是维基百科。如果需要文档,则尽一切可能。这是一个答案,它提供了所有必要的东西。事实上,它的简短和简洁是无关紧要的。它可以扩展为“将类型移出程序类”,但这并没有增加多少内容。
  <connectionStrings>
    <add name="EftDbContext"
     connectionString="Database=TestDB;Server=(local);Integrated Security=SSPI" providerName="System.Data.SqlClient" />
  </connectionStrings>