Entity framework EF 4.1代码优先错误-实体类型SomeType不是当前上下文模型的一部分

Entity framework EF 4.1代码优先错误-实体类型SomeType不是当前上下文模型的一部分,entity-framework,code-first,entity-framework-4.1,Entity Framework,Code First,Entity Framework 4.1,首先使用EF代码时,我在不同的时间遇到以下错误: 实体类型SomeType不是当前上下文的模型的一部分 MyDbContext.Entry(ParentEnt.ChildEnt).State = EntityState.Unchanged; 此错误的可能原因是什么?发生此错误的原因可能是: DbContext配置的连接字符串不正确 指定的实体实际上未在配置中映射 我一直在首先创建数据库,并使用内置模板生成我的模型(EF 4.1) 我将生成的代码复制到一个新文件中,并删除了导航属性。就在那时,

首先使用EF代码时,我在不同的时间遇到以下错误:

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

MyDbContext.Entry(ParentEnt.ChildEnt).State = EntityState.Unchanged;
此错误的可能原因是什么?

发生此错误的原因可能是:

  • DbContext配置的连接字符串不正确
  • 指定的实体实际上未在配置中映射

我一直在首先创建数据库,并使用内置模板生成我的模型(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; }
    }
}
namespace TestApp.BLL
{
使用制度;
使用System.Collections.Generic;
公共部分类用户
{
公共用户()
{
//this.Roles=new HashSet();
}
public int UserId{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符串用户名{get;set;}
公共字符串密码{get;set;}
//公共虚拟ICollection角色{get;set;}
}
}

上面的代码显示了注释掉的导航属性。如果我在所有POCO上取消对它们的注释(也就是说角色POCO),异常就会消失。

如果您尝试在一对多关联中的子集合上设置EntityState之类的操作,也会出现此消息

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

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

MyDbContext.Entry(ParentEnt.ChildEnt).State = EntityState.Unchanged;
以下更改不会产生错误:

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

请注意,在本例中使用
First()
可能表示t

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

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

    // etc. ... 
}
公共类MyDBContext:DbContext
{
公共数据库集模型{get;set;}
//等等。。。
}

这也可能是由于POCO上的属性与EDMX/modelbuilder中的属性命名不完全一致造成的。请参阅我的帖子,了解我是如何解决这个问题的


更新

这个错误通过我对数据库所做的各种更新不断攻击我。最后,我删除了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
    }
}
//------------------------------------------------------------------------------
// 
//此代码是从模板生成的。
//
//手动更改此文件可能会导致应用程序出现意外行为。
//如果重新生成代码,将覆盖对此文件的手动更改。
// 
//------------------------------------------------------------------------------
名称空间MyProgram.Models
{
使用制度;
使用System.Collections.Generic;
公共部分类问题
{
公共int id{get;set;}
公共字符串标题{get;set;}
公共字符串体{get;set;}
公共字符串标记{get;set;}
public int voces{get;set;}//我必须手动添加这个属性,该属性在数据库中可以为null int
}
}
我在生成初始模型后添加了属性。但是,我甚至尝试删除表并重新创建它。这并没有解决问题。只有手动添加属性才能为我修复它。

我有此错误

几小时前,我在db视图中添加了一个新字段。我更新了上下文(作为我正在做的其他事情的一部分),并得到了这个错误

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

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

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

此错误似乎在内部/EDMX模型未成功构建或未完全构建时发生。这个问题有很多潜在的原因。不幸的是,在构建模型时,似乎没有足够的错误报告或错误检测,因此解决它似乎需要尝试一些事情,看看是什么让问题消失


在过去的几天里,我遇到了这个错误的另一个实例,使用了EF 6.0(当前的预发布代码)、code first和自定义约定。事实证明,根本原因是我有一个自定义约定来重命名ID属性(例如ID->MyTypeId)。如果我禁用了我的自定义约定,这个问题就会消失;如果启用约定,则会出现问题。没有日志记录、异常或其他错误表明在构建模型时发生了问题。在我尝试将实体添加到DbSet之前,这个异常不会出现。该约定在生成数据库(通过迁移)时没有引起任何问题。

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

在我的场景中,我使用EF6将MySQL数据库迁移到MSSQL。我有两个独立的模型和上下文,每个模型和上下文都有自己的连接字符串