2012-06-07 32 views
7

Tôi có một ứng dụng ASP.Net mvc3 nhỏ và tôi đang ở phần chỉnh sửa. Tôi có mẫu mặc định:Cách truy cập giá trị thực thể cũ trong ASP.NET Entity Framework

public ActionResult Edit(int id) 
{ 
    User user = db.Users.Find(id); 
    return View(user); 
} 

public ActionResult Edit(User user) 
{ 
    //(Here access to old user name for example) 
    db.Entry(user).State = EntityState.Modified; 
    db.SaveChanges(); 
} 

Nếu tôi có user.name Tôi có giá trị mới nhưng tôi muốn truy cập giá trị db trước khi lưu.

Cảm ơn!

+0

http://stackoverflow.com/editing-help#code – SLaks

Trả lời

10

tôi đã nhận nó làm việc với một thủ thuật nhỏ:.

db.Users.Attach(user); 
var current = db.Entry(user).CurrentValues.Clone(); 
db.Entry(user).Reload(); 
//Do you user(from db) stuff 
db.Entry(user).CurrentValues.SetValues(current); 
db.Entry(user).State = EntityState.Modified; 
db.SaveChanges(); 
+1

+1 được thực hiện tốt. Đã được chỉ cần thêm một bình luận với một gợi ý tương tự như bài trước của tôi khi tôi nhận thấy bạn đã giải quyết nó. – lkaradashkov

+0

db.Entry (người dùng) .GetDatabaseValues ​​() sẽ là một ứng cử viên tốt hơn so với CurrentValues, trong trường hợp các thuộc tính đã được sửa đổi trong mã sau khi chúng được kéo từ DB. – Faiz

0

Làm thế nào về điều này:

public ActionResult Edit(User user) 
{ 
    User oldUser = db.Users.Find(user.id); 
    // oldUser object represents the user before the modification 
    ... 
    db.Entry(user).State = EntityState.Modified; 
    db.SaveChanges(); 
} 
+0

Thật không may, tôi đã thử điều đó nhưng nó mang lại cho tôi ngoại lệ: Một đối tượng có cùng khóa đã tồn tại trong ObjectStateManager. ObjectStateManager không thể theo dõi nhiều đối tượng bằng cùng một khóa. – MaT

2

context.Entry (YourEntity) .GetDatabaseValues ​​() ToObject() như YourEntity

0

Thêm vào câu trả lời của lkaradashkov. Bạn có thể thử sử dụng tùy chọn AsNoTracking() để ngăn chặn Entity Framework theo dõi nó.

public ActionResult Edit(User user) 
{ 
    User oldUser = db.Users.AsNoTracking().Single(x=>x.id.equals(user.id)); 
    // oldUser object represents the user before the modification 
    ... 
    db.Entry(user).State = EntityState.Modified; 
    db.SaveChanges(); 
} 
0

Nếu bạn muốn nhận được giá trị cũ và giá trị mới riêng biệt:

//user.UserName = "oldtest"  
user.UserName = "Test"  
var originalValues = db.Entry(user).OriginalValues.Clone(); 
var originalval = originalValues.GetValue<string>("UserName"); 
var currentvalue = db.Entry(user).CurrentValues.Clone(); 
var curretval = currentvalue.GetValue<string>("UserName"); 

này sẽ trở lại originalval như giá trị cũ trước khi thiết lập tên người dùng mới là "oldtest" và curretval trở UserName mới là "Test"

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