2016-04-13 8 views
1

私の異なるプロジェクトが動作していて、モデルを小さくしてテーブルを削除して再作成する必要がありました。私がアプリケーションを実行するたびに、次の例外を受け取りました:Entity Framework "メンバー[...]がメタデータコレクションに存在しません

(私は、

IDが 'SGDB.DAL.Contexts.Person_Department'のメンバは、 がメタデータコレクションに存在しません。パラメータ名:identity。

私のモデルを変更する前に(人と部の関係とは関係ありません)、すべて正常に機能しました。さらに、私のすべてのモデルの識別子はId(EFが期待する)という名前で、[Key]属性で修飾されています。

私はすでにこのトピックについての他のスレッドを読んでいますが、解決策はすべての外部キー(私のケースではPerson.csのDepartmentId)のIdプロパティを作成することでしたが、私はそれが気に入らないそれは前に働いた。

原因は何でしょうか?

アップデート1:

私は、次のように新しい人をシードしようとしている:

protected override void Seed(PersonContext context) { 
     base.Seed(context); 
     var dep = new DAL.Contexts.DepartmentContext().Departments.First(); 

     var status = new Status { 
      StatusType = "Test" 
     }; 

     var persondata = new PersonData { 
      Status = status 
     }; 
     context.Status.Add(status); 
     context.PersonData.Add(persondata); 
     for (int i = 0; i < 10; i++) { 
      var person = new Person { 
       Firstname = $"TestPersonFirstname{i}", 
       Lastname = $"TestPersonLastname{i}", 
       SourceType = COM.SourceType.Manual, 
       Department = dep, 
       PersonData = persondata 
      }; 
     context.Persons.Add(person); 
     } 


     context.SaveChanges(); 

    } 

答えて

0

私は同じ問題を抱えていました。私の問題は、テーブルの1つに「代わりに挿入」トリガーに関連していました。

EFフレームワークは、scope_identity()を呼び出して挿入されたデータ行に対して検証を実行しています。しかし、 "insertの代わりに"トリガーは、EFシステムのscope_identityへの呼び出しがnullを返すような方法で、挿入のコンテキストを変更します。

あなたはこれらのいくつか行うことができます。

  1. (私のために働いていた)の代わりに、挿入トリガーを削除します。
  2. EFフレームワークの検証をオフにします。context.Configuration.ValidateOnSaveEnabled = false; (これも が働いた)

希望します。

+0

妥当性検査をオフにしても問題は解決しませんでした。あなたの最初に言及された解決策はどのように機能しますか?私はEFの新機能です。新しい部署(新しい部署=新しいDepartmentContext()。Departments.First();)をシードするときに、新しい部署をDBに配置してこのデータセットを呼び出すことです。 ?もしそうなら、私は新しい人物を挿入するためにデータベースからデータを取得する必要がありますか? – C4p741nZ

0

私もこの問題に遭遇し、以下のコードを挿入トリガーの代わりに追加して修正しました。

SELECT SCOPE_IDENTITY() AS <IdFieldName>