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

时间:2011-04-12 11:25:30

标签: entity-framework code-first entity-framework-4.1

在使用EF代码时,我会在不同时间收到以下错误:

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

出现此错误的可能原因是什么?

10 个答案:

答案 0 :(得分:40)

可能是因为:

  • 使用错误的连接字符串配置的DbContext
  • 指定的实体实际上未在配置中映射

答案 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模型。所以我不得不重新添加,重命名并手动设置代码中第二个模型的连接字符串。