2012-04-30 8 views
2

私のコードは簡単なようだ:ASP.NET MVC 3、コードファーストEF:OriginalValues?

bool rv = false; 
var results = from user in Users 
      where user.userName.Equals(newUser.userName) 
      select user; 
if (results.Count() == 0) 
{ 
    this.context.Users.Add(newUser); 
    this.context.SaveChanges(); 
    rv = true; 
} 
return rv; 

しかし、これは言う内部例外値で DbEntityValidationExceptionが発生します。 OriginalValues cannot be used for entities in the Added state.

を...ということでも何を意味するのでしょうか?私が考えることができるのは、にプライベートセッターがあり、userID(プライマリキーとして)がデータベース生成されているにもかかわらず、newUserの値が0であるということだけです。しかし、の場合は、これまでどおり任意のEFデータベースにオブジェクトを挿入するためにAdd()を単に使用することはできません。だから私は混乱している。

これにいくつかの光を当てるのを助けることができる人に事前に感謝します。

ETA:newUserは私のコントローラに次のコードによって作成されます。

[HttpPost] 
public ActionResult CreateRegistration(FormVMRegistration newRegistration) 
{ 
    //draw info from form and add a new user to repository 
    User newUser = new User(); 
    newUser.userName = newRegistration.userName; 
    newUser.screenName = newRegistration.screenName; 
    newUser.password = newRegistration.usersPW; 

    bool addSuccess = userRep.Add(newUser); 
    ... 
} 

FormVMRegistrationは、コントローラにRegiostrationフォームからデータを伝えるために、何が、文字列プロパティを持つだけでViewModelにあります。 userRepは私のユーザーリポジトリです。

+0

UserIdは実際にはプライベートセッターを持っているはずです.EFはその値を保存時にこのプロパティに入れようとします。これはpublicでなければなりません –

+0

newUserが作成される前のコードは何ですか? – emragins

+0

@ルーク:私はフリーマンとサンダーソンの例に従っていましたが、私はそれを公開に変更し、とにかく同じ例外を受けています。 –

答えて

0

私はそれが保存される前にnewUserオブジェクトを使用しているという事実から来ていると思います。

var results = from user in Users 
     where user.userName.Equals(passedUserName) 
     select user; 

幸運:にあなたのLINQクエリを変更する(与えられたpassedUserNameは上から渡された名前である)、その後

bool addSuccess = userRep.Add(newUser, newRegistration.userName); 

にこのライン

bool addSuccess = userRep.Add(newUser); 

を変更しようと!

+0

こんにちは、veblock、あなたの提案をありがとう!それはうまくいかなかった。私のリポジトリは 'this.context.Users.Add(new User(newRegistration));)を呼び出すことで追加することができました。 –

0

近づけると、問題はオブジェクトへの「深い」参照、または参照への参照に起因すると考えられます。 IOW、FooクラスはBooクラスへのリファレンスを作成したBooクラスへの参照を作成しました。これはFooクラスへの参照を作成しました。そして明らかにEFはこれをあまり好きではありません。