EF 4.1 Code First错误 – 实体typesSomeType不是当前上下文的模型的一部分

在使用EF代码的时候,我会在不同的时间给出下面的错误:

实体typesSomeType不是当前上下文模型的一部分。

这个错误的可能原因是什么?

这可能是因为:

  • DbContextconfiguration了不正确的连接string
  • 指定的实体实际上未在configuration中映射

当我从DbContextinheritance的类没有将模型声明为属性时,我得到了这个。 例如,我忽略在下面的代码中为FooModel添加一个属性:

 public class MyDBContext : DbContext { public DbSet<FooModel> FooModels{ get; set; } // etc. ... } 

如果尝试在一对多关联中对子集合上的某个EntityState进行设置,则也会出现此消息。

例如; 如果下面的代码片段中的ParentEnt和ChildEnt之间存在一对多关联,则会显示以下错误消息:

实体typesHash1Type不是当前上下文的模型的一部分。

 MyDbContext.Entry(ParentEnt.ChildEnt).State = EntityState.Unchanged; 

以下更改不会产生错误:

 MyDbContext.Entry(ParentEnd.ChildEnt.First).State = EntityState.Unchanged; 

请注意,在这种情况下使用First()可能表示t

这也可能是由于您的POCO属性没有正确命名,因为它们在EDMX / modelbuilder中。 请在这里看到我的post了解如何解决问题的细节。

实体types<class>不是当前上下文的模型的一部分

我有这个错误。

事实certificate,我已经添加了一个新的领域数据库查看几个小时前。 我更新了上下文(作为我正在做的其他事情的一部分),并得到了这个错误。

当我更新POCO的时候一切都很顺利:EF抛出了这个错误,因为它无法将视图中的字段映射到视图的POCO中的属性。

在这种情况下IMO不是最有用的错误消息。

当您的模型未正确映射到您的类时,可能会发生这种情况。 在我的情况下,我得到这个错误,当我使用EF模型优先,当我从数据库更新我的EDMX模型,但没有更新我的实体类。 具体来说,实体中的属性是小写的,而在DB中,EDMX图是大写的。 另一个问题是EDMX图中的模型属性没有转换为我的应用程序枚举因此,EF无法识别该实体。

我一直在做数据库,并使用内置的模板生成模型(EF 4.1)

我将生成的代码复制到一个新文件中,并删除了导航属性。 那时我开始看到这个错误。 我closures了懒加载,但似乎POCO的导航属性仍然​​是必要的。

我想这个错误可能表明你的模型缺less一些东西。

 namespace TestApp.BLL { using System; using System.Collections.Generic; public partial class User { public User() { //this.Roles = new HashSet<Role>(); } public int UserId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string UserName { get; set; } public string Password { get; set; } //public virtual ICollection<Role> Roles { get; set; } } } 

上面的代码显示了注释的导航属性。 如果我在所有POCO(也就是POCOangular色)上取消注释,这个例外就会消失。

UPDATE

这个错误不断的攻击着我对数据库进行的各种更新。 最后我删除了edmx文件,并使用相同的表格和存储的特效再次创build它。

当生成的实体缺less可空列时,我得到了这个:

 //------------------------------------------------------------------------------ // <auto-generated> // This code was generated from a template. // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace MyProgram.Models { using System; using System.Collections.Generic; public partial class Question { public int id { get; set; } public string title { get; set; } public string body { get; set; } public string tags { get; set; } public int votes { get; set; }//I had to manually add this property which is nullable int in the database } } 

我在生成初始模型后添加了属性。 但是,我甚至尝试删除表格并重新创build它。 这并没有解决它。 只有手动添加属性才能修复它。

回答这个问题是“这个错误的可能原因是什么?”:

内部/ EDMX模型没有成功build立,或者没有完全build立,这个错误似乎就会发生。 这个问题的原因有很多。 不幸的是,在构build模型时似乎没有足够的错误报告或错误检测,因此解决这个问题似乎涉及到尝试一堆事情,看看是什么让问题消失。

在过去的几天中,我遇到了另一个这样的错误,使用EF 6.0(目前预发布代码),代码优先和自定义约定。 事实certificate,根本原因是我有一个自定义约定,重命名ID EdmProperty(例如ID – > MyTypeId)。 如果我禁用了自定义约定,这个问题就消失了。 如果我启用了我的约定,问题就会发生。 没有日志logging或exception或其他错误来指示在构build模型时发生问题。 直到我尝试添加一个实体到一个DbSet时,这个exception才会后退。 生成数据库时(通过迁移),约定没有造成任何问题。

在我的场景中,我使用EF6将MySQL数据库迁移到MSSQL。 我有2个独立的模型和上下文,每个都有自己的连接string。 这些类具有相同的名称,但是MySQL的全部是小写字母,而MSSQL是一个Pascal封套。 我从包含我的EDMX模型的相关程序集中复制了两个连接string。 但是当我运行我的应用程序时,我得到了关于已经添加到字典列表的2个连接string之一的错误。

所以我删除了冲突的条目,愚蠢地认为它以某种方式访问​​程序集自己的app.config中的连接string(这是晚!)。 但是,不,错误实际上是因为两个连接string也有相同的名字 – 一个全部是小写字母,一个是Pascal字体 – 即Dictionary键忽略了大小写。 所以当我删除MySQL的时候,它试图为这两个模型使用MSSQL连接string。 所以我不得不重新添加,重命名和手动设置代码中的第二个模型的连接string。