在使用EF代码时,我会在不同时间收到以下错误:
实体类型SomeType不是当前上下文模型的一部分。
出现此错误的可能原因是什么?
答案 0 :(得分:40)
可能是因为:
答案 1 :(得分:15)
当我继承自DbContext的类没有将模型声明为属性时,我得到了这个。例如,我忽略了在下面的代码中为FooModel添加一个属性:
public class MyDBContext : DbContext
{
public DbSet<FooModel> FooModels{ get; set; }
// etc. ...
}
答案 2 :(得分:5)
如果您尝试在一对多关联中对子集合设置EntityState,则会出现此消息。
例如;如果下面的代码片段中ParentEnt和ChildEnt之间存在一对多关联,则会显示错误消息:
实体类型 Hash1Type 不是当前上下文模型的一部分。
MyDbContext.Entry(ParentEnt.ChildEnt).State = EntityState.Unchanged;
以下更改不会产生错误:
MyDbContext.Entry(ParentEnd.ChildEnt.First).State = EntityState.Unchanged;
请注意,在这种情况下使用First()
可能表示t
答案 3 :(得分:1)
这也可能是由于您的POCO上的属性没有像EDMX / modelbuilder中那样完全命名。请在此处查看我的帖子,了解我如何解决问题的详细信息。
The entity type <class> is not part of the model for the current context
答案 4 :(得分:1)
我有这个错误。
事实证明我几小时前已经在db View中添加了一个新字段。我更新了上下文(作为我正在做的其他事情的一部分)并得到了这个错误。
当我更新POCO时,一切都很好:EF抛出此错误,因为它无法将View中的字段映射到View的POCO中的属性。
在这种情况下,IMO不是最有用的错误消息。
答案 5 :(得分:1)
当您的模型未正确映射到您的班级时,可能会发生这种情况。在我的情况下,当我使用EF Model First时,当我从DB更新我的EDMX模型但没有更新我的Entity类时,我遇到了这个错误。具体来说,Entity中的属性为小写,而DB和EDMX中的属性为大写。 我的另一个问题是EDMX图中的模型属性未转换为我的应用程序Enum所以EF无法识别该实体。
答案 6 :(得分:0)
我一直在做数据库,并为我的模型使用内置模板生成(EF 4.1)
我将生成的代码复制到新文件中并删除了导航属性。那是我开始看到这个错误的时候。我关闭了延迟加载,但是在POCO中仍然需要导航属性。
我认为错误可能表明您的模型遗漏了某些内容。
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上取消注释它们(也就是角色POCO),那么例外就会消失。
答案 7 :(得分:0)
<强>更新强>
此错误一直在攻击我,我对数据库进行了各种更新。最后我删除了edmx文件,并使用相同的表和存储过程再次创建它。
<强>旧强>
当生成的实体缺少可空列时,我得到了这个:
//------------------------------------------------------------------------------
// <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
}
}
我在生成初始模型后添加了属性。但是,我甚至尝试删除表并重新创建它。这没有解决它。只为我添加属性手动修复它。
答案 8 :(得分:0)
回答这个问题是“这个错误的可能原因是什么?”:
当内部/ EDMX模型未成功构建或未完全构建时,似乎会发生此错误。并且导致此问题的原因很多。遗憾的是,在构建模型时似乎没有足够的错误报告或错误检测,因此解决它似乎涉及尝试一堆事情来查看导致问题消失的原因。
我在过去几天遇到了这个错误的另一个实例,使用了EF 6.0(目前是预发布代码),代码优先和自定义约定。事实证明,根本原因是我有一个自定义约定重命名ID EdmProperty(例如ID - &gt; MyTypeId)。如果我禁用了我的自定义约定,这个问题就消失了如果我启用了我的约定,则会出现问题。没有记录或异常或其他错误来指示构建模型时发生问题。在我尝试将实体添加到DbSet之前,此异常不会停止。该约定在生成数据库时没有引起任何问题(通过迁移)。
答案 9 :(得分:0)
在我的场景中,我使用EF6将MySQL数据库迁移到MSSQL。我有两个独立的模型和上下文,每个都有自己的连接字符串。这些类具有相同的名称,但MySQL的全部小写,MSSQL的一个Pascal大小写。我复制了包含我的EDMX模型的相关程序集中的两个连接字符串。但是当我运行我的应用程序时,我收到一个错误,关于已经添加到字典列表中的2个连接字符串之一。
所以我删除了冲突的条目,愚蠢地认为它以某种方式访问了程序集自己的app.config中的连接字符串(它已经很晚了!)。但不,错误确实发生,因为两个连接字符串也有相同的名称 - 一个全部小写,一个在Pascal大小写 - 即字典键忽略大小写。因此,当我删除MySQL时,它尝试使用MSSQL连接字符串用于BOTH模型。所以我不得不重新添加,重命名并手动设置代码中第二个模型的连接字符串。