我正在研究一個由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%確定這將如何影響我想要做的事情。
歡迎提供所有建議和解釋。 在此先感謝。
謝謝史蒂夫的答案!這給了我更多的見解:) – Sn0wBlind