2011-05-02 61 views
4

EF4.1-Code-First-Gurus!部分使用EF Code First和ASP.NET MVC更新對象

我不知道是否有處理以下ASP.NET MVC 3 EF 4.1代碼第一種情形更優雅的方式:可以說,我們有以下波蘇斯:

public class Entity 
{ 
    [Key] 
    public int Id { get; set; } 

    [ScaffoldColumn(false)] 
    public DateTime CreatedOn { get; set; } 

    [ScaffoldColumn(false)] 
    public DateTime ModifiedOn { get; set; } 
} 

public class Person : Entity 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime Birthday { get; set; } 
} 

假設我們已經創建了一些標準的編輯視圖,它們不包括CreatedOn/ModifiedOn字段,因爲它們將在存儲庫中而不是由用戶設置。

在我的信息庫中,我有以下更新方法。該方法節選字段列表,它應該被更新(離開CreatedOn/ModifiedOn領域出):

public void Update(Person person, List<string> properties) 
    { 
     Person tmpPerson = context.People.Single(x => x.Id == person.Id); 
     context.People.Attach(tmpPerson); 

     foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(person)) 
     { 
      if (properties.Contains(descriptor.Name)) 
       descriptor.SetValue(tmpPerson, descriptor.GetValue(person)); 
     } 

     tmpPerson.ModifiedOn = DateTime.Now; 
    } 

現在控制器調用此方法是這樣的:

[HttpPost] 
    public ActionResult Edit(Person person) 
    { 
     if (ModelState.IsValid) { 

      personRepository.Update(person, new List<string> { "FirstName", "LastName", "Birthday"}); 

      personRepository.Save(); 
      return RedirectToAction("Index"); 
     } else { 
      return View(); 
     } 
    } 

這一切工作像魅力。但是,我真的不喜歡,我必須手動指定字段。你將如何處理這個要求?當然,我可以將CreatedOn/ModifiedOn字段作爲隱藏字段添加到視圖中,但我不想將表單加載到很多(有更多的字段)。

也許這是一個類似的問題: How To Update EF 4 Entity In ASP.NET MVC 3?

我非常感謝您的幫助! 里斯

回答

7

是的,有更優雅的版本:

public void Update(Person person, params Expression<Func<Person,object>>[] properties) 
{ 
    context.People.Attach(person); 

    DbEntityEntry<Person> entry = context.Entry(person); 

    foreach (var property in properties) 
    { 
     entry.Property(property).IsModified = true; 
    } 

    person.ModifiedOn = DateTime.Now; 
} 

你會調用該方法是這樣的:

[HttpPost] 
public ActionResult Edit(Person person) 
{ 
    if (ModelState.IsValid) 
    { 

     personRepository.Update(person, p => p.FirstName, 
      p => p.LastName, p => p.Birthday); 
     personRepository.Save(); 
     return RedirectToAction("Index"); 
    } 
    else 
    { 
     return View(person); 
    } 
} 
+0

運行完美。非常感謝你!祝你有個愉快的一天,喬里斯 – 2011-05-02 21:29:55