【发布时间】:2011-08-03 19:30:07
【问题描述】:
首先使用 EF 代码时,我在不同时间收到以下错误:
实体类型 SomeType 不是当前上下文模型的一部分。
这个错误的可能原因是什么?
【问题讨论】:
-
你能发布你的模型的代码吗?
标签: entity-framework code-first entity-framework-4.1
首先使用 EF 代码时,我在不同时间收到以下错误:
实体类型 SomeType 不是当前上下文模型的一部分。
这个错误的可能原因是什么?
【问题讨论】:
标签: entity-framework code-first entity-framework-4.1
这可能是因为:
【讨论】:
EntityConnectionStringBuilder 的MetaData 属性提供了不正确的程序集(以"res://MyAssemblyThatContainsTheModel/" 的形式)。我给它一个没有实体数据模型嵌入资源的程序集,它只是构建了一个没有实体的模型。这是因为我使用了 Assembly.GetCallingAssembly(),由于 JIT 的方法内联,它返回了不正确的程序集。我用[MethodImpl(MethodImplOptions.NoInlining)] 标记了内联方法,它解决了这个问题。
当我从 DbContext 继承的类没有将模型声明为属性时,我得到了这个。例如,我忽略了在下面的代码中为 FooModel 添加一个属性:
public class MyDBContext : DbContext
{
public DbSet<FooModel> FooModels{ get; set; }
// etc. ...
}
【讨论】:
如果您尝试在一对多关联中对子集合设置 EntityState 之类的操作,也会出现此消息。
例如;如果在下面的代码sn-p中ParentEnt和ChildEnt之间存在一对多关联,报错信息:
实体类型 Hash1Type 不是当前上下文模型的一部分。
MyDbContext.Entry(ParentEnt.ChildEnt).State = EntityState.Unchanged;
以下更改不会产生错误:
MyDbContext.Entry(ParentEnd.ChildEnt.First).State = EntityState.Unchanged;
请注意,在这种情况下使用 First() 可能表示 t
【讨论】:
这也可能是由于 POCO 上的属性没有像 EDMX/modelbuilder 中那样准确命名。请在此处查看我的帖子,详细了解我是如何解决这个问题的。
The entity type <class> is not part of the model for the current context
【讨论】:
我遇到了这个错误。
原来我在几个小时前向 db View 添加了一个新字段。我更新了上下文(作为我正在做的其他事情的一部分)并得到了这个错误。
当我更新 POCO 时,一切都很好:EF 抛出了这个错误,因为它无法将视图中的字段映射到视图的 POCO 中的属性。
在这种情况下 IMO 不是最有用的错误消息。
【讨论】:
当您的模型未正确映射到您的类时,可能会发生这种情况。在我的情况下,当我使用 EF Model First 以及从 DB 更新我的 EDMX 模型但没有更新我的实体类时,我得到了这个错误。具体来说,Entity 中的属性是小写的,而 DB 和 EDMX 图中的属性是大写的。 我遇到的另一个问题是 EDMX 图中的模型属性未转换为我的应用程序枚举,因此 EF 无法识别该实体。
【讨论】:
我一直在做数据库,并为我的模型使用内置模板生成 (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),异常就会消失。
【讨论】:
更新
我对数据库进行的各种更新一直在攻击我。最终我删除了 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
}
}
我在生成初始模型后添加了该属性。但是,我什至尝试删除表并重新创建它。那并没有解决它。仅添加属性为我手动修复它。
【讨论】:
回答问题是“这个错误的可能原因是什么?”:
此错误似乎在内部/EDMX 模型未成功构建或未完全构建时发生。这个问题有很多潜在的原因。不幸的是,在构建模型时似乎没有足够的错误报告或错误检测,因此解决它似乎需要尝试一堆东西,看看是什么让问题消失了。
在过去的几天里,我使用 EF 6.0(当前为预发布代码)、代码优先和自定义约定遇到了此错误的另一个实例。事实证明,根本原因是我有一个自定义约定,它重命名了 ID EdmProperty(例如 ID -> MyTypeId)。如果我禁用了我的自定义约定,这个问题就消失了;如果我启用了我的约定,就会出现问题。没有日志记录、异常或其他错误表明在构建模型时发生了问题。在我尝试将实体添加到 DbSet 之前,此异常不会出现。该约定在生成数据库时(通过迁移)没有造成任何问题。
【讨论】:
在我的场景中,我使用 EF6 将 MySQL 数据库迁移到 MSSQL。我有 2 个单独的模型和上下文,每个模型和上下文都有自己的连接字符串。这些类具有相同的名称,但 MySQL 一个全小写,MSSQL 一个 Pascal 大小写。我已经从包含我的 EDMX 模型的相关程序集中复制了两个连接字符串。但是当我运行我的应用程序时,我收到一个错误,提示 2 个连接字符串之一已添加到字典列表中。
所以我删除了冲突的条目,愚蠢地认为它以某种方式访问了程序集自己的 app.config 中的连接字符串(太晚了!)。但是不,错误确实发生了,因为两个连接字符串也具有相同的名称 - 一个全小写,一个使用 Pascal 大小写 - 即 Dictionary 键忽略大小写。因此,当我删除 MySQL 时,它尝试将 MSSQL 连接字符串用于两种模型。所以我不得不在代码中为第二个模型重新添加、重命名和手动设置连接字符串。
【讨论】: