EFが他のDBContextのオブジェクトの再挿入を防ぐにはどうすればよいですか?
-
25-10-2019 - |
質問
私はMVC 3プロジェクトでEF 4.1を使用しており、オブジェクトの挿入に問題があります。セッションも使用して、いくつかのオブジェクトを保持しています。コンクリートで:
私は親子関係を持つシンプルなクラスを持っています:
public class Event
{
public User Promotor {get;set;}
}
プロモーターはcurrentuserに基づいています。私のアプリケーションでは、currentuserをHTTPセッションに保存します。このようなイベントを追加すると、ユーザー(および関連するすべてのオブジェクト)が新しいプライマリキーでもう1回挿入されます。
//1st request inserts/loads the user
User user;
using (var context = new MyDbContext())
{
user = new User();
context.Users.Add(user);
context.SaveChanges();
}
//2nd request saves the event
var before = db.Users.Count();
var @event = new Event
{
Promotor = user, //user was kept in Session
};
db.Entry(@event).State = EntityState.Added;
db.SaveChanges();
ユーザーの状態を確認すると、「追加」されますが、主キーは0ではなく、EFはすでに永続的であることを知っている必要があります。私の永続性コードに多くを追加せずに、これを修正するにはどうすればよいですか。すべてのリクエストで、currentuserを新しいdbcontextに再装着する必要がありますか?これにより、DBコードがアプリケーションに「漏れ」になります。 DBのものをデータレイヤーに入れたいと思います。私はこのようなリポジトリを使用しています:
public void Save(T entity)
{
dbContext.Entry(entity).State = IsPersistent(entity) ?
EntityState.Modified : EntityState.Added;
dbContext.SaveChanges();
}
解決
あなたがすでに自分自身に言及したように、あなたの現在のコンテキストにユーザーを再接続することは問題を解決するはずです。私が知っている唯一の方法は、主要なキー値に基づいてコンテキストで再びオブジェクトを再び取得することです。
所属していません StackOverflow