星期二, 10月 14, 2014

entity framework 通用欄位更新小技巧

今天跟大家分享小技巧,有做過專案的人一定會遇到,有些專案的 DB 一定會開幾個必有的欄位,例如:
CreateDateTime (新增時間)
CreateBy (新增人員)
UpdateDateTime (更新時間)
UpdateBy (更新的人)
IsEanbed (是否可用)
像這些欄位,其實蠻討厭的,因為在每次的新增修改都要去處理..

//Create 
var db = new MyDB();
var user = Help.GetUser();
db.Users.Add(new User(){
 CreateDateTime = DateTime.Now,
 CreateBy = user.Id,
 UpdateDateTime = DateTime.Now,
 UpdateBy = User.Id,
 IsEanbed = true
});
db.SaveChanges();

//Update
var db = new MyDB();
var user = Help.GetUser();
var dbUser = db.Users.First();
db.UpdateDateTime = DateTime.Now;
db.UpdateBy = User.Id;
db.SaveChanges();

像這些 code 就很討厭,所以我的作法就在最後的 SaveChange 這個 method 前統一處理,可以參考下列網址 http://msdn.microsoft.com/zh-tw/library/vstudio/cc716714%28v=vs.100%29.aspx
public override int SaveChanges(SaveOptions options)
{
    foreach (ObjectStateEntry entry in ObjectStateManager
      .GetObjectStateEntries(EntityState.Added | EntityState.Modified))
    {
 // Validate the objects in the Added and Modified state
 // if the validation fails throw an exeption.
 //create
 var cShadow = new
 {
     CreateDateTime = DateTime.Now,
     CreateBy = userInfo.ID,
     UpdateDateTime = DateTime.Now,
     UpdateBy = userInfo.ID,
     IsEanbed = true
 };
 var createdData = Context.ObjectStateManager
                     .GetObjectStateEntries(EntityState.Added);
 foreach (var item in createdData)
 {
     item.Entity.InjectFrom(cShadow);
 }
 
 //update
 var mShadow = new
 {
     UpdateDateTime = DateTime.Now,
     UpdateBy = userInfo.ID
 };
 var modifiedData = Context.ObjectStateManager
                     .GetObjectStateEntries(EntityState.Modified);
 foreach (var item in modifiedData)
 {
     item.Entity.InjectFrom(mShadow);
 }
 
 return base.SaveChanges(options);
}

還有我有用 ValueInjecter 這自動注入的 library,是因為它可以幫我們自動反射注入,反射這部分就不用自己做了,大概就這樣,這小技巧,分享一下!

Reference
http://msdn.microsoft.com/zh-tw/library/vstudio/cc716714%28v=vs.100%29.aspx
http://valueinjecter.codeplex.com/

沒有留言: