ฉันได้ทำการสำรวจวิธีการต่าง ๆ ในการแก้ไข / ปรับปรุงระเบียนภายใน Entity Framework 5 ในสภาพแวดล้อม ASP.NET MVC3 แต่จนถึงขณะนี้ยังไม่มีใครทำเครื่องหมายในช่องทั้งหมดที่ฉันต้องการ ฉันจะอธิบายว่าทำไม
ฉันได้พบสามวิธีที่ฉันจะพูดถึงข้อดีและข้อเสีย:
วิธีที่ 1 - โหลดระเบียนต้นฉบับอัปเดตแต่ละคุณสมบัติ
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
original.BusinessEntityId = updatedUser.BusinessEntityId;
original.Email = updatedUser.Email;
original.EmployeeId = updatedUser.EmployeeId;
original.Forename = updatedUser.Forename;
original.Surname = updatedUser.Surname;
original.Telephone = updatedUser.Telephone;
original.Title = updatedUser.Title;
original.Fax = updatedUser.Fax;
original.ASPNetUserId = updatedUser.ASPNetUserId;
db.SaveChanges();
}
ข้อดี
- สามารถระบุคุณสมบัติที่เปลี่ยนแปลงได้
- มุมมองไม่จำเป็นต้องมีคุณสมบัติทั้งหมด
จุดด้อย
- 2 x เคียวรีบนฐานข้อมูลเพื่อโหลดต้นฉบับจากนั้นอัพเดต
วิธีที่ 2 - โหลดบันทึกต้นฉบับตั้งค่าที่เปลี่ยนแปลง
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
db.Entry(original).CurrentValues.SetValues(updatedUser);
db.SaveChanges();
}
ข้อดี
- คุณสมบัติที่ถูกแก้ไขเท่านั้นที่ถูกส่งไปยังฐานข้อมูล
จุดด้อย
- มุมมองต้องมีคุณสมบัติทั้งหมด
- 2 x เคียวรีบนฐานข้อมูลเพื่อโหลดต้นฉบับจากนั้นอัพเดต
วิธีที่ 3 - แนบระเบียนที่อัปเดตและตั้งค่าสถานะเป็น EntityState.Modified
db.Users.Attach(updatedUser);
db.Entry(updatedUser).State = EntityState.Modified;
db.SaveChanges();
ข้อดี
- 1 x แบบสอบถามบนฐานข้อมูลที่จะอัปเดต
จุดด้อย
- ไม่สามารถระบุว่าคุณสมบัติใดจะเปลี่ยนแปลง
- มุมมองต้องมีคุณสมบัติทั้งหมด
คำถาม
คำถามของฉันกับพวกคุณ มีวิธีที่สะอาดที่ฉันสามารถบรรลุเป้าหมายชุดนี้หรือไม่?
- สามารถระบุคุณสมบัติที่เปลี่ยนแปลงได้
- มุมมองไม่จำเป็นต้องมีคุณสมบัติทั้งหมด (เช่นรหัสผ่าน!)
- 1 x แบบสอบถามบนฐานข้อมูลที่จะอัปเดต
ฉันเข้าใจว่านี่เป็นสิ่งเล็ก ๆ น้อย ๆ ที่ชี้ให้เห็น แต่ฉันอาจพลาดวิธีง่ายๆในการนี้ หากไม่ใช่วิธีที่หนึ่งจะเหนือกว่า ;-)