一、背景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()); } } }
最后大功告成,不再用每次都赋值一次了。