2017-05-02 22 views
1

データベースからレコードを更新する単純なMVCアプリケーションを開発していました。私はオブジェクトが別のクラスから返されたときにEntity Frameworkに変更を保存できません

Student.cs以下

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace WebApplication1.DAL 
{ 
    public class Student 
    { 
     DemoDatabaseEntities db = new DemoDatabaseEntities(); 
     public Student_Mast getStudentByID() 
     { 
      Student_Mast student = db.Student_Mast.Where(i => i.StudID == 1).FirstOrDefault(); 
      return student; 
     } 
    } 
} 

StudentController.csなどの記録や更新を取得するためにBALとコントローラを使用しました

public class UpdateController : Controller 
{ 
    DemoDatabaseEntities db = new DemoDatabaseEntities(); 
    Student _bal = new Student(); 
    /GET: Update 
    public ActionResult Index() 
    { 
     Student_Mast model = new Student_Mast(); 
     model = _bal.getStudentByID(); 
     model.First_Name = "Hardik"; 
     model.Last_Name = "Gondalia"; 
     db.SaveChanges(); 
     return View(); 
    } 
} 

しかしdb.savechanges()のdoesnレコードを更新しません。これに代えて
私は以下のようにレコードを更新する場合は、あなたのDbContextの別のインスタンスからレコードを取得しているので、それは
StudentController.cs

public class UpdateController : Controller 
{ 
    DemoDatabaseEntities db = new DemoDatabaseEntities(); 
    Student _bal = new Student(); 
    /GET: Update 
    public ActionResult Index() 
    { 
     Student_Mast model = new Student_Mast(); 
     model = db.Student_Mast.Where(i => i.StudID == 1).FirstOrDefault(); 
     model.First_Name = "Hardik"; 
     model.Last_Name = "Gondalia"; 
     db.SaveChanges(); 
     return View(); 
    } 
} 

答えて

1

を動作しますが、それを保存することができません。 解決策は、DbContextインスタンスを取得し、それをあなたの持つ変数に保存するコンストラクタをStudentクラスに追加することです。

public class Student 
{ 
    private DemoDatabaseEntities db = null; 

    public Student(DemoDatabaseEntities dbContext){ 
    { 
     this.db = dbContext; 
    } 

    public Student_Mast getStudentByID() 
    { 
     Student_Mast student = db.Student_Mast.Where(i => i.StudID == 1).FirstOrDefault(); 
     return student; 
    } 
} 
1

Studentクラスに同じデータベースエンティティクラスDemoDatabaseEntitiesを渡します。今StudentControllerに、あなたはこれが実際に学生を取得するには、両方のデータベース操作のために、同じデータベースコンテキストオブジェクト、すなわちで使用されており、バックデシベルに更新するには、この

public class UpdateController : Controller 
{ 
    DemoDatabaseEntities db = new DemoDatabaseEntities(); 
    Student _bal = new Student(db); 
    /GET: Update 
    public ActionResult Index() 
    { 
     Student_Mast model = new Student_Mast(); 
     model = _bal.getStudentByID(); 
     model.First_Name = "Hardik"; 
     model.Last_Name = "Gondalia"; 
     db.SaveChanges(); 
     return View(); 
    } 
} 

を行います。この代わりに

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace WebApplication1.DAL 
{ 
    public class Student 
    { 
     DemoDatabaseEntities db; 
     public Student(DemoDatabaseEntities _db) 
     { 
      this.db = _db 
     } 

     public Student_Mast getStudentByID() 
     { 
      Student_Mast student = db.Student_Mast 
          .Where(i => i.StudID == 1).FirstOrDefault(); 
      return student; 
     } 
    } 
} 

のようにしてください。

1

_bal.getStudentByID();が別のEFコンテキストからStudentエンティティを取得しており、このエンティティがdbコンテキストからデタッチされているために発生しています。

あなたは次のコードが含まれます、あなたのコンテキストにエンティティを添付したり、最初のケースでStudentクラス

に依存関係としてStudentController.csの更新バージョンを既存のコンテキストを渡すことができます。

public class UpdateController : Controller 
{ 
    DemoDatabaseEntities db = new DemoDatabaseEntities(); 
    Student _bal = new Student(); 
    /GET: Update 
    public ActionResult Index() 
    { 
     Student_Mast model = new Student_Mast(); 
     model = _bal.getStudentByID(); 
     db.Entry(model).State = EntityState.Modified 

     model.First_Name = "Hardik"; 
     model.Last_Name = "Gondalia"; 
     db.SaveChanges(); 
     return View(); 
    } 
} 

何2番目のケースで起きているのはすでに上記の回答です

+0

あなたのコードもdb.Entry(モデル).State = EntityState.Modified私のために動作します。しかし、ベストプラクティスは何ですか? –

+0

@UbiquitousDevelopers複数のコンテキストを管理するのは難しいため、すべてのデータフェッチサービスに依存するコンテキストを渡すことをお勧めします。私はちょうどあなたのコードが正確に動作していなかった理由を示します – hmnzr

1

最初の例の問題は、student ent別のデータコンテキストインスタンスから取得します。ここでは2つのオプションがあります。StudentクラスにUpdateメソッドを実装して、生徒のエンティティが由来する同じDbContextインスタンスに変更を保存します。これは悪いデザインです。これらのメソッドをエンティティで定義しないでくださいRepositoryUnitOfWorkパターン)、またはあなたの第二の例でみてくださいとしてあなたのコントローラに更新を定義します。

var model = db.Student_Mast.FirstOrDefault(i => i.StudID == 1); 
model.First_Name = "Hardik"; 
model.Last_Name = "Gondalia"; 
db.SaveChanges(); 
関連する問題