2011-01-12 38 views
7

Tôi có 2 dự án - một thư viện lớp có chứa một mô hình EDM Entity Framework và một dự án ASP.NET MVC riêng biệt.Làm thế nào để cập nhật thực thể EF 4 trong ASP.NET MVC 3?

Tôi đang gặp sự cố với cách giả sử của bạn chỉnh sửa và lưu các thay đổi đối với thực thể bằng MVC. Trong điều khiển của tôi, tôi có:

public class UserController : Controller 
    { 
     public ActionResult Edit(int id) 
     { 
      var rep = new UserRepository(); 

      var user = rep.GetById(id); 

      return View(user); 
     } 

     [HttpPost] 
     public ActionResult Edit(User user) 
     { 
      var rep = new UserRepository(); 

      rep.Update(user); 

      return View(user); 
     } 
    } 

My UserRepository có một phương pháp cập nhật như thế này:

public void Update(User user) 
{ 
    using (var context = new PDS_FMPEntities()) 
    { 
     context.Users.Attach(testUser); 
     context.ObjectStateManager.ChangeObjectState(testUser, EntityState.Modified); 
     context.SaveChanges(); 
    } 
} 

Bây giờ, khi tôi bấm 'Save' trên trang người dùng chỉnh sửa, tham số user chỉ chứa hai giá trị dân cư: Id và FirstName. Tôi lấy nó là do thực tế là tôi chỉ hiển thị hai thuộc tính đó trong khung nhìn.

Câu hỏi của tôi là, nếu tôi đang cập nhật tên của người dùng, và sau đó muốn lưu nó, tôi giả sử làm gì với các thuộc tính khác User không được hiển thị trên chế độ xem vì giờ đây chúng chứa 0 hoặc Giá trị NULL trong đối tượng user?

Tôi đã đọc rất nhiều về việc sử dụng các thực thể sơ khai, nhưng tôi không nhận được nhanh chóng, trong đó không có ví dụ nào tôi đã thực sự làm việc. tức là tôi tiếp tục nhận ngoại lệ liên quan đến EntityKey.

Ai đó có thể chỉ cho tôi một hướng dẫn/ví dụ tốt về cách cập nhật thực thể EF 4 bằng cách sử dụng lớp lưu trữ, được gọi là đầu cuối của MVC không?

Trả lời

1

OK, sau một số lần thử và lỗi, tôi tìm cách tìm ra giải pháp. Dưới đây là cập nhật Update phương pháp của tôi trong UserRepository:

public void Update(User user) 
{ 
    using (this.Context) 
    { 
     var tempUser = new User { usr_id = user.usr_id }; 

     this.Context.Users.Attach(tempUser); 
     this.Context.ApplyCurrentValues("Users", user); 
     this.Context.SaveChanges(); 
    } 
} 

Một số ví dụ khác tôi đã cố gắng đã tiến rất gần đến việc trên, nhưng chỉ mất nhãn hiệu.

+2

@ Jason Evans - được gọi là kỹ thuật còn sơ khai, và chỉ hoạt động đối với tài sản vô hướng. Nếu bạn có một thuộc tính điều hướng như 'User.Addresses' mà bạn đang ràng buộc trong View của bạn, thì ở trên sẽ không cập nhật địa chỉ. Tôi sẽ khuyên bạn nên truy xuất lại User từ DB, sau đó sử dụng 'TryUpdateModel' để cập nhật đối tượng. Xem câu hỏi/câu trả lời gần đây của tôi tại đây để biết thêm thông tin: http://stackoverflow.com/questions/4653834/asp-net-mvc-ef4-poco-repository-how-to-update-relationships/4666466#4666466 – RPM1984

+0

@ RPM1984 - Điều đó sẽ tiết kiệm rắc rối với các thuộc tính định hướng. Mối quan tâm mà tôi có với TryUpdateModel() là thiết kế. Tôi đang cố gắng để đảm bảo rằng tôi có thể sử dụng một kho lưu trữ để đối phó với việc nhận/tiết kiệm/xóa các công cụ. Bằng cách sử dụng TryUpdateModel(), bạn có gợi ý về thiết kế tốt về cách viết mã này không? Tôi chỉ không muốn các bộ điều khiển để đối phó với bất kỳ mã cơ sở dữ liệu liên quan nếu bạn thấy những gì tôi có ý nghĩa. –

+0

Không, không chắc chắn ý bạn là gì. Mặc dù vậy, tôi sẽ đoán, tạo một phương thức "Lưu" tiêu chuẩn trong Kho lưu trữ của bạn, mà "tìm ra" nếu đó là một đối tượng mới/hiện có (dựa trên ID, ví dụ). Vì vậy, bạn không cần phải gọi repository.Update hoặc repository.Add. Chỉ cần TryUpdateModel rồi Lưu. Nếu bạn đề cập đến bạn không muốn điều khiển của bạn chạm vào thực thể của bạn - tôi không hiểu mối quan tâm của bạn. Bộ điều khiển có nghĩa là làm mới mô hình. Và tất cả nó đang làm là cập nhật một "đối tượng" - kho lưu trữ của bạn vẫn còn quan tâm đến sự kiên trì của đối tượng đã nói. – RPM1984

2

Tôi sẽ truy xuất người dùng từ cơ sở dữ liệu và cập nhật thực thể đó. EF không thể kỳ diệu biết được những giá trị nào được cho là phải sửa đổi và không được sửa đổi.

Nếu bạn lo lắng về các vấn đề tương tranh, bạn cần phải lưu dấu thời gian trong chế độ xem - thường là giá trị biểu mẫu ẩn.

0

tôi thấy hướng dẫn này trên trang web asp.net để thể rất hữu ích: Getting Started with EF using MVC - Updating Related Data

Phương pháp chú ý đến là TryUpdateModel mà sẽ cập nhật các mô hình có liên quan theo cách "chuẩn" (thiết lập các thực thể để một trạng thái đã sửa đổi và chuyển tất cả mọi thứ vào) và sau đó sẽ cho phép bạn tùy chỉnh cách các thuộc tính nhất định được cập nhật.

Tôi đã gặp sự cố với khóa tổ chức và điều này đã giúp tôi vượt qua chúng.

+1

Cảm ơn bạn đã nhập. Tôi sẽ giữ điều này trong danh sách các tài nguyên về EF. Nhiều đánh giá cao. –

0

Đây có thể là một chút muộn để giúp trả lời câu hỏi, nhưng có lẽ nó sẽ giúp một số người khác.Dường như với tôi rằng vấn đề chính bạn đang gặp phải là do thực tế rằng cá thể bối cảnh cơ sở dữ liệu đọc một thực thể được xử lý sau khi một trang được hiển thị. Vì vậy, khi bạn cố gắng lưu nó, đây là một trường hợp mới của một ngữ cảnh, do đó không có kiến ​​thức về cuộc gọi ngữ cảnh trước đó. Entity Framework do đó phải cập nhật tất cả các hàng trong cơ sở dữ liệu, bởi vì nó không có cách nào để biết những hàng nào đã được thay đổi. Điều này đang được nói, phương pháp tốt nhất mà tôi đã tìm thấy để lưu tất cả dữ liệu cũ và cập nhật những gì tôi muốn thay đổi, là thực hiện cuộc gọi mới đến cơ sở dữ liệu trước, thiết lập tất cả thông tin bắt buộc cho một Mô hình (hoặc bất kỳ thứ gì bạn đang sử dụng để lưu dữ liệu của bạn) vào những gì hiện có trong DB. Sau đó thực hiện các thay đổi cần thiết cho thông tin đó, và sau đó lưu kết quả vào DB.

Bạn có thể nhìn vào hướng dẫn về thực hiện cơ bản CRUD vào đây để biết thêm thông tin: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-basic-crud-functionality-with-the-entity-framework-in-asp-net-mvc-application

Các vấn đề liên quan