【问题标题】:EF 4.1 Code First error - The entity type SomeType is not part of the model for the current contextEF 4.1 Code First 错误-实体类型 SomeType 不是当前上下文模型的一部分
【发布时间】:2011-08-03 19:30:07
【问题描述】:

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

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

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

【问题讨论】:

  • 你能发布你的模型的代码吗?

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


【解决方案1】:

这可能是因为:

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

【讨论】:

  • 检查连接字符串。当我将一个 .edmx 文件的连接字符串复制到另一个文件时,我遇到了同样的问题。它不起作用。
  • @Shreedhar 在 arch 的场景中,连接字符串没有任何元数据(由 EDMX 文件生成)。不过,也许您可​​以帮助解决这个问题:stackoverflow.com/questions/13634819/…
  • 我是手动构建连接字符串的,所以对我来说,这是因为我为EntityConnectionStringBuilderMetaData 属性提供了不正确的程序集(以"res://MyAssemblyThatContainsTheModel/" 的形式)。我给它一个没有实体数据模型嵌入资源的程序集,它只是构建了一个没有实体的模型。这是因为我使用了 Assembly.GetCallingAssembly(),由于 JIT 的方法内联,它返回了不正确的程序集。我用[MethodImpl(MethodImplOptions.NoInlining)] 标记了内联方法,它解决了这个问题。
  • 当我错误配置 AutoFixture 以便它重新设置 DbContext 的属性(包括连接字符串)时,我发现这是导致此问题的原因。
【解决方案2】:

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

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

    // etc. ... 
}

【讨论】:

  • +1 这正是我面临的问题。谢谢!
【解决方案3】:

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

例如;如果在下面的代码sn-p中ParentEnt和ChildEnt之间存在一对多关联,报错信息:

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

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

以下更改不会产生错误:

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

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

【讨论】:

    【解决方案4】:

    这也可能是由于 POCO 上的属性没有像 EDMX/modelbuilder 中那样准确命名。请在此处查看我的帖子,详细了解我是如何解决这个问题的。

    The entity type <class> is not part of the model for the current context

    【讨论】:

      【解决方案5】:

      我遇到了这个错误。

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

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          我一直在做数据库,并为我的模型使用内置模板生成 (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),异常就会消失。

          【讨论】:

            【解决方案8】:

            更新

            我对数据库进行的各种更新一直在攻击我。最终我删除了 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
                }
            }
            

            我在生成初始模型后添加了该属性。但是,我什至尝试删除表并重新创建它。那并没有解决它。仅添加属性为我手动修复它。

            【讨论】:

              【解决方案9】:

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

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

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

              【讨论】:

                【解决方案10】:

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

                所以我删除了冲突的条目,愚蠢地认为它以某种方式访问​​了程序集自己的 app.config 中的连接字符串(太晚了!)。但是不,错误确实发生了,因为两个连接字符串也具有相同的名称 - 一个全小写,一个使用 Pascal 大小写 - 即 Dictionary 键忽略大小写。因此,当我删除 MySQL 时,它尝试将 MSSQL 连接字符串用于两种模型。所以我不得不在代码中为第二个模型重新添加、重命名和手动设置连接字符串。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-04-30
                  • 2013-11-10
                  • 2014-11-30
                  • 2017-06-19
                  • 2011-06-26
                  • 2014-01-08
                  • 2014-03-29
                  相关资源
                  最近更新 更多