2016-07-13 3 views
0

Entity Frameworkコードを使用してASP.NET mvcプロジェクトを開発しています。しかし、データベースに新しいデータを挿入すると関連するデータが更新されるという問題があります。下記の私のシナリオをご覧ください。エンティティフレームワーク内で以前に取得した関連エンティティの更新を防止する

は、私はあなたが見ることができるように私は、コントローラのアクション

public ActionResult Post(ViewModel model) 
    { 
     User user = repo.User(model.UserId); 
     //Do a lot of stuffs with user object 
     //Eg I changed country 
     user.Country = "Just a temporary country. This should not be changed in database"; 
     . 
     . 
     //Then create an account 
     repo.CreateAccount(user,model.Balance); 
     return View(); 
    } 

にこのような何かをやっている

public User User(int id) 
{ 
    return context.Users.Find(id); 
} 

public Account CreateAccount(User user,decimal balance) 
{ 
    Account ac = new Account{ 
     Balance = 5000, 
     UserId = user.id 
    }; 
    context.Accounts.Add(ac); 
    context.SaveChanges(); 
} 

リポジトリにこのメソッドを持って、この

User{ 
    public int Id{ get;set; } 
    public string Name{ get;set; } 
    public string Country { get;set; } 
} 

Account{ 
    public int Id{ get;set; } 
    public decimal Balance { get;set; } 
    public int UserId { get;set } 

    public virtual User User; 
} 

のような類似したエンティティを持っています私はアカウントを作成する前に、私は国を変更しました。しかし、アカウントを作成すると、データベースの国の価値も変わりました。これは私の問題の単なる例です。だから私の質問は、別の関連エンティティを作成したときに、以前に取得した関連エンティティを更新しないようにエンティティフレームワークを停止することが可能なのでしょうか?私の例では、ユーザーアカウントを作成するときに更新された国名を停止します。それは可能ですか?可能であればどうしたらいいですか?

+0

ユーザを変更しないでマークする必要がありますこれらのリポジトリレイヤーはすべて、私があなたがどこでそれをすべきか分かりません。すべてのリポジトリが同じ 'context'インスタンスを使用しているかどうかは明らかではありませんが、リポジトリが' SaveChanges'をなぜ呼び出すのか分かりません。それは非常に不便です。また、保存されていないのに、なぜ「たくさんのもの」をやっていますか? –

+0

Dependency InjectionのためにNinjectを使用しているため、リポジトリにSaveChangesを実行しています。 –

+0

ユーザーを変更しないとマークするにはどうすればよいですか?例:context.Users.Unchanged()。私はそれのための方法が表示されません。 –

答えて

1

あなたはこのように、コールCreateAccount方法の前または中にユーザエンティティを切り離すことができます。この

public User User(int id) 
{ 
    return context.Users.Where(e=>e.Id == id) 
     .AsNoTracking().FirstOrDefault(id); 
} 

、いつでもしたいように、

context.Entry(user).State = EntityState.Detached; 

またはAsNoTrackingからレポユーザーメソッドを使用中更新するユーザを明示的に更新する方法:

context.Entry(user).State = EntityState.Modified; 
+0

ありがとうございます。それが私の問題を解決しました。 –

関連する問題