一、背景spa
日常咱們在建表的時候通常除了業務字段,還會加上如Create_Date 、Create_User 、Update_Date 、Update_User這樣的通用字段 ;code
1 public Nullable<System.DateTime> Create_Date { get; set; } 2 public string Create_User { get; set; } 3 public Nullable<System.DateTime> Update_Date { get; set; } 4 public string Update_User { get; set; }
這樣的公共字段,主要用於數據變動的核查,那麼在建立或者修改的時候,對象
通常的賦值方式是這樣的blog
BQoolCommon_Inner_Country_Timezone model = new BQoolCommon_Inner_Country_Timezone(); model.Create_Date = DateTime.UtcNow; model.Create_User = "test"; model.Update_Date = DateTime.UtcNow; model.Update_User = "test";
直接在對象實體裏面直接賦值,可是這樣就會形成不少的重複工做,說實在的寫得多了會煩,也容易出錯;get
二、實現string
那麼有沒有偷懶的辦法呢,答案是確定的。it
下面咱們看下如何在EntityFramework實現指定通用字段的賦值;io
2.1首先是添加數據class
public void Create(TEntity instance) { if (instance == null) { throw new ArgumentNullException("instance"); } else { _context.Set<TEntity>().Add(instance); SetCreate(instance); SaveChanges(instance); } }
經過反射方式,對指定的字段賦值test
private void SetCreate(TEntity instance) { var attachedEntry = _context.Entry(instance); PropertyInfo getProperty(string propertyName) { return attachedEntry.Entity.GetType().GetProperty(propertyName); } //Create_User if (getProperty("Create_User") != null && string.IsNullOrEmpty(getProperty("Create_User").GetValue(attachedEntry.Entity) as string)) { getProperty("Create_User").SetValue(attachedEntry.Entity, _user); } else if (getProperty("CreateUser") != null && string.IsNullOrEmpty(getProperty("CreateUser").GetValue(attachedEntry.Entity) as string)) { getProperty("CreateUser").SetValue(attachedEntry.Entity, _user); } //Create_Date if (getProperty("Create_Date") != null) { DateTime? createDate = getProperty("Create_Date").GetValue(attachedEntry.Entity) as DateTime?; if (createDate == null || createDate == DateTime.MinValue) { getProperty("Create_Date").SetValue(attachedEntry.Entity, GetDBTime()); } } else if (getProperty("CreateDate") != null && getProperty("CreateDate").GetValue(attachedEntry.Entity) as DateTime? == null) { DateTime? createDate = getProperty("CreateDate").GetValue(attachedEntry.Entity) as DateTime?; if (createDate == null || createDate == DateTime.MinValue) { getProperty("CreateDate").SetValue(attachedEntry.Entity, GetDBTime()); } } }
2.2再者是更新操做
public void Update(TEntity instance) { if (instance == null) { throw new ArgumentNullException("instance"); } else { SetUpdate(instance); //_context.Entry(instance).State = EntityState.Modified; _context.Set<TEntity>().AddOrUpdate(instance); SaveChanges(instance); } }
如上方式
public void SetUpdate(TEntity instance) { if (instance == null) { throw new ArgumentNullException("instance"); } else { var attachedEntry = _context.Entry(instance); if (attachedEntry.Entity.GetType().GetProperty("Update_User") != null && !string.IsNullOrEmpty(_user)) { attachedEntry.Entity.GetType().GetProperty("Update_User").SetValue(attachedEntry.Entity, _user); } else if (attachedEntry.Entity.GetType().GetProperty("UpdateUser") != null && !string.IsNullOrEmpty(_user)) { attachedEntry.Entity.GetType().GetProperty("UpdateUser").SetValue(attachedEntry.Entity, _user); } if (attachedEntry.Entity.GetType().GetProperty("Update_Date") != null) { attachedEntry.Entity.GetType().GetProperty("Update_Date").SetValue(attachedEntry.Entity, GetDBTime()); } else if (attachedEntry.Entity.GetType().GetProperty("UpdateDate") != null) { attachedEntry.Entity.GetType().GetProperty("UpdateDate").SetValue(attachedEntry.Entity, GetDBTime()); } } }
最後大功告成,不再用每次都賦值一次了。