2011-09-22 70 views
1

我在我的域模型中具有兩個日期時間類型屬性entrydate和updatedon的此實體服務。當更新標記實體日期時間屬性不變

當編輯視圖中的用戶進行任何更改並將表單提交回來時,我希望被標記爲更改的postingback/modified對象的entrydate屬性使得entrydate在執行更新時不能被覆蓋。被更改保存到數據庫

public class Service 
{ 
    public int ServiceID 
    { 
     get; 
     set; 

    } 
    [Required(ErrorMessage="Please enter Name")] 
    public string Name 
    { 
     get; 
     set; 
    } 

    [Required(ErrorMessage="Please enter the duration for the service")] 
    public short Duration 
    { 
     get; 
     set; 
    } 


    [DataType(DataType.Date)] 
    public DateTime EntryDate 
    { 
     get; 
     set; 
    } 

    [DataType(DataType.Date)] 
    public DateTime UpdatedOn 
    { 
     get; 
     set; 
    } 



    public decimal Cost 
    { 
     get; set; 

    } 
} 

庫方法如下:

else { 
    // Existing entity 
    var serviceInDb = context.Services.Find(service.ServiceID); 
    service.EntryDate = serviceInDb.EntryDate; 
    context.Entry(serviceInDb).CurrentValues.SetValues(service); 
} 

當你調用SaveChanges更高版本的更新:

public void InsertOrUpdate(Service service) 
    { 
     if (service.ServiceID == default(int)) { 
      // New entity 
      context.Services.Add(service); 
     } else { 
      // Existing entity 

      context.Entry(service).State = EntityState.Modified; 
     } 
    } 
+0

避免模型驅動驗證。 – zsong

+0

你如何保存實體? –

+0

現在您知道我如何將更改保存到我的實體。上述代碼已更新 – najam

回答

1

您可以從數據庫中重新加載原始實體語句僅用於真正更改的屬性將發送到數據庫(對其他未更改的屬性也有好處)。

或者只是重新加載EntryDate

else { 
    // Existing entity 
    var entryDateInDb = context.Services 
     .Select(s => s.EntryDate) 
     .Single(s => s.ServiceID == service.ServiceID); 
    service.EntryDate = entryDateInDb; 
    context.Entry(service).State = EntityState.Modified; 
} 

另一個工作但醜陋的做法是這樣的:

context.Services.Attach(service); // thanks to user202448, see comments 

context.Entry(service).Property(s => s.Name).IsModified = true; 
context.Entry(service).Property(s => s.Duration).IsModified = true; 
context.Entry(service).Property(s => s.UpdatedOn).IsModified = true; 
context.Entry(service).Property(s => s.Cost).IsModified = true; 

所以,請不要將EntryDate屬性設置爲修改,但所有其他屬性一個由一。

它進入腦海的方法...

context.Entry(service).State = EntityState.Modified; 
context.Entry(service).Property(s => s.EntryDate).IsModified = false; 

...不幸的是不起作用,因爲設置回未修改一個屬性,它已被標記爲Modified不支持,將拋出例外。

+0

您必須在醜陋的方法之前使用'context.Services.Attach(service);'。 – user202448

+0

@ user202448:的確,我糾正了這一點,謝謝! – Slauma