2015-05-01 200 views
0

我正在研究一個由UI層(MVC),業務層,域層(用於模型)和DAL(用於存儲庫和EF DbContext)組成的N層應用程序。EF代碼首先驗證和更新對象

當我更新現有對象的屬性時,我對實體框架的內部工作感到困惑,我正在尋找一種更好的方式來在數據庫中更新其值之前驗證對象。

我有以下型號:

public class BlogPost 
{ 
    public int BlogPostId { get; set; } 

    [Required] 
    public String Title { get; set; } 

    [Required] 
    public String Description { get; set; } 

    [Required] 
    public DateTime DateTime { get; set; } 

    public byte[] Image { get; set; } 
} 

我有我的經理以下方法BL:

public BlogPost AddBlogPost(string title, string description, byte[] image = null) 
{ 
    BlogPost blogPost = new BlogPost() 
    { 
     Title = title, 
     Description = description, 
     DateTime = DateTime.Now 
    }; 

    Validate(blogPost); 
    moduleRepository.CreateBlogPost(blogPost); 

    return blogPost; 
} 

public BlogPost ChangeBlogPost(BlogPost blogPost) 
{ 
    moduleRepository.UpdateBlogPost(blogPost); 
    return blogPost; 
} 

而且我在DAL以下方法:

public BlogPost CreateBlogPost(BlogPost b) 
{ 
    b = context.BlogPosts.Add(b); 
    context.SaveChanges(); 

    return b; 
} 

public BlogPost UpdateBlogPost(BlogPost b) 
{ 
    context.Entry(b).State = EntityState.Modified; 
    context.SaveChanges(); 

    return b; 
} 

我現在的問題是:什麼是檢查模型是否有效的好方法實際上試圖改變它在數據庫中的值?

我的想法是這樣的:

public BlogPost ChangeBlogPost(BlogPost blogPost) 
{ 
    // STEP 1: put the updated data in a new object 
    BlogPost updatedBlogPost = new BlogPost() 
    { 
     Title = blogPost.Title, 
     Description = blogPost.Description, 
     Image = blogPost.Image, 
     DateTime = blogPost.DateTime 
    }; 

    // STEP 2: check if the model is valid 
    this.Validate(updatedBlogPost); 

    // STEP 3: read the existing blog post with that ID and change the properties 
    BlogPost b = moduleRepository.ReadBlogPost(blogPost.BlogPostId); 

    b.Title = blogPost.Title; 
    b.Description = blogPost.Description; 
    b.Image = blogPost.Image; 
    b.DateTime = blogPost.DateTime; 

    moduleRepository.UpdateBlogPost(blogPost); 
    return blogPost; 
} 

編輯:我想這也許最好只接受基本類型,如上述方法,而不是對象的參數。

我有一種感覺,對於簡單更新來說工作太多了,但我在互聯網上找不到任何其他東西。

這可能也是值得注意的,我使用的是爲的DbContext,所以我必須確保實體框架不檢查這些值是有效的(因爲另一個調用之前更改數據庫中的值另一個類的上下文可能導致SaveChanges())。

我知道DbContext上的singleton是不好的做法,但我沒有看到其他選擇,以避免在處理多個存儲庫和實體時受到多個上下文實例的跟蹤。 PS:我也讀過關於實體框架中的變更追蹤,但我不是100%確定這將如何影響我想要做的事情。

歡迎提供所有建議和解釋。 在此先感謝。

回答

0

好吧,我有點回答自己的問題,同時做一些研究和測試一些虛擬數據。我認爲,當一個屬性在MVC中由於編輯視圖而改變時,EF也會跟蹤它並在數據庫中對其進行更改。

我想通過模型綁定實際上創建一個新對象(而不是編輯動態代理的屬性)之後,模型綁定的工作原理和實現方式並不是那麼簡單。

我想我現在可以只驗證模型,然後只更新數據庫中具有相同主鍵的那個。