1、背景
平常我们在建表的时候一般除了业务字段,还会加上如Create_Date 、Create_User 、Update_Date 、Update_User这样的通用字段 ;
public Nullable<System.DateTime> Create_Date { get; set; }
public string Create_User { get; set; }
public Nullable<System.DateTime> Update_Date { get; set; }
public string Update_User { get; set; }
这样的公共字段,主要用于数据变更的核查,那么在创建或者修改的时候,.
一般的赋值方式是这样的
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";
直接在对象实体里面直接赋值,但是这样就会造成很多的重复工作,说实在的写得多了会烦,也容易出错;
2、实现
那么有没有偷懒的办法呢,答案是肯定的。
下面我们看下如何在EntityFramework实现指定通用字段的赋值;
2.1首先是添加数据
public void Create(TEntity instance)
{
if (instance == null)
{
throw new ArgumentNullException("instance");
}
else
{
_context.Set<TEntity>().Add(instance);
SetCreate(instance);
SaveChanges(instance);
}
}
通过反射方式,对指定的字段赋值
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());
}
}
}
最后大功告成,再也不用每次都赋值一次了。