web-dev-qa-db-ja.com

EF 4.1 Code Firstエラー-エンティティタイプSomeTypeは現在のコンテキストのモデルの一部ではありません

EFコードを最初に操作しているときに、さまざまなタイミングで以下のエラーが表示されます。

エンティティタイプSomeTypeは、現在のコンテキストのモデルの一部ではありません。

このエラーの考えられる原因は何ですか?

42
rovsen

次の理由で発生する可能性があります。

  • 誤った接続文字列で構成されたDbContext
  • 指定されたエンティティは、実際には構成にマッピングされていません
40
rovsen

DbContextから継承したクラスがモデルをプロパティとして宣言しなかったときにこれを取得しました。たとえば、以下のコードでFooModelのプロパティを追加するのを怠りました。

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

    // etc. ... 
}
15
GraehamF

このメッセージは、1対多の関連付けで子コレクションにEntityStateを設定するなど、なんとかしようとした場合にも表示されます。

例えば;以下のコードスニペットでParentEntとChildEntの間に1対多の関連付けが存在する場合、エラーメッセージ:

エンティティタイプHash1Typeは、現在のコンテキストのモデルの一部ではありません。

_MyDbContext.Entry(ParentEnt.ChildEnt).State = EntityState.Unchanged;
_

次の変更はエラーを生成しません。

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

この場合のFirst()の使用はt

5
Doug Kimzey

モデルがクラスに正しくマップされていない場合に発生する可能性があります。私の場合、EF Model Firstを使用し、EDMXモデルをDBから更新したが、Entityクラスを更新しなかったときにこのエラーが発生しました。具体的には、エンティティのプロパティは小文字でしたが、DBおよびEDMXダイアグラムでは大文字でした。また、EDMXダイアグラムのモデルプロパティがアプリのEnumに変換されず、EFがそのエンティティを認識できなかったという問題もありました。

1
Amir Chatrbahr

これは、EDMX/modelbuilderにあるため、正確に名前が付けられていないPOCOのプロパティによっても発生する可能性があります。問題の解決方法の詳細については、こちらの投稿をご覧ください。

エンティティタイプ<class>は現在のコンテキストのモデルの一部ではありません

1
Aaron Bar

このエラーが発生しました。

数時間前にdbビューに新しいフィールドを追加したことが判明しました。コンテキストを更新して(私がやっていたことの一部として)、このエラーが発生しました。

POCOをすべて更新したとき、EFはビューのフィールドをビューのPOCOのプロパティにマップできなかったため、このエラーをスローしました。

この状況IMOで最も役立つエラーメッセージではありません。

1
Neil Thompson

私のシナリオでは、EF6を使用してMySQLデータベースをMSSQLに移行していました。 2つの個別のモデルとコンテキストがあり、それぞれに独自の接続文字列がありました。クラスの名前は同じでしたが、MySQLの名前はすべて小文字で、MSSQLの名前はPascalでした。 EDMXモデルを含む関連アセンブリから両方の接続文字列をコピーしました。しかし、アプリケーションを実行したときに、2つの接続文字列の1つが辞書リストに既に追加されているというエラーが発生しました。

そのため、競合するエントリを削除し、アセンブリのapp.configの接続文字列に何らかの方法でアクセスできると愚かに考えました(遅い!)。しかし、いや、両方の接続文字列も同じ名前(1つはすべて小文字で、もう1つはPascal大文字小文字)を使用しているため、エラーが実際に発生しました。つまり、Dictionaryキーは大文字小文字を無視します。したがって、MySQLを削除したときに、両方のモデルにMSSQL接続文字列を使用しようとしました。そのため、コード内の2番目のモデルの接続文字列を追加し、名前を変更し、手動で設定する必要がありました。

0
Breeno

[〜#〜] update [〜#〜]

このエラーは、データベースに対して行ったさまざまな更新で攻撃を続けました。最終的に、edmxファイルを削除し、同じテーブルとストアドプロシージャで再度作成しました。

生成されたエンティティにNULL許容列が欠落しているときにこれを取得しました。

//------------------------------------------------------------------------------
// <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
    }
}

初期モデルを生成した後にプロパティを追加しました。しかし、テーブルを削除して再作成することさえ試みました。それはそれを修正しませんでした。手動でプロパティを追加するだけで修正されました。

0
P.Brian.Mackey

最初にデータベースを作成し、モデルに組み込みのテンプレート生成を使用しました(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も意味します)、例外はなくなります。

0
mbursill

質問への回答は、「このエラーの考えられる原因は何ですか?」です。

このエラーは、内部/ EDMXモデルが正常に構築されない場合、または完全に構築されない場合に発生するようです。そして、この問題には多くの潜在的な原因があります。モデルを構築する際にエラー報告やエラー検出が不十分であるように思われるのは残念です。そのため、問題を解決するために多くのことを試してみる必要があります。

過去数日間、EF 6.0(現在のプレリリースコード)、コードファースト、およびカスタム規則を使用して、このエラーの別のインスタンスに遭遇しました。根本的な原因は、ID EdmPropertyの名前を変更するカスタム規則(たとえば、ID-> MyTypeId)であることが判明しています。カスタムコンベンションを無効にすると、この問題はなくなりました。規約を有効にすると、問題が発生します。モデルの構築時に問題が発生したことを示すログ、例外、またはその他のエラーはありません。この例外は、エンティティをDbSetに追加しようとするまで頭を悩ませません。この規則は、データベースを生成するときに(移行を介して)問題を引き起こしませんでした。

0
crimbo