0

サービスレイヤーまたはリポジトリ内のデータを更新する正しい方法を知りたいのですが、サービス/リポジトリ外のオブジェクトに変更を加えないようにします..例:

public class PersonRepository{
     public class Insert(Person person){
          //code
          _db.SaveChanges();
     }
}

public class TaskRepository{
     public class Insert(Task task){
          //code
          _db.SaveChanges();
     }

     public void Update(Task task){}
}

およびコントローラーのサンプルコード:

public ActionResult Insert(Task task)
{
     _taskRepository.Insert(task);

     task.Title = "foo";

     _personRepository.Insert(new Person()); //here the problem!
}

新しい人を自動的に保存すると、エンティティはタスクのタイトルを更新します!!! では、どうすればそれを制御できますか?メインリポジトリ外での挿入/更新を拒否したい(この場合、タスクはタスクリポジトリ内でのみ挿入/更新する必要があります)。

プロキシを無効にする必要がありますか? または追跡を変更しますか?それとも?

4

1 に答える 1

1

リポジトリが DBContext を共有しているようです。したがって _db.SaveChanges();、PersonRepository を呼び出すと、DBContext オブジェクトは、追跡しているエンティティに加えられたすべての変更を保存します。これには、タスク オブジェクトが含まれます。

これを回避するにはさまざまな方法がありますが、DBContext オブジェクトをusingステートメントでラップすると、ジョブの実行後に確実に破棄され、返されたオブジェクトを追跡しなくなります。

public class TaskRepository
{
     public class Insert(Task task)
     {
          using(var db = new YourContext())
          {
              //code here
              db.SaveChanges();
          }
     } 
}

DBContext の作成と破棄にはコストがかかる可能性があるため、これはパフォーマンスに影響を与える可能性があることに注意してください。

于 2012-12-06T02:47:04.280 に答える