我有以下代码来更新从强类型视图返回的JobCard对象。但是,使用JobCard实体调用GetModifiedMembers
会返回JobCard的每个属性,CurrentValue
和OriginalValue
都会设置为当前值。
public int Update(BusinessObjects.JobCard model)
{
Poynting.Installation.DataObjects.LinqToSql.JobCard entity = JobCardMapper.ToEntity(model);
using (Database db = DataContextFactory.CreateContext())
{
try
{
//LinqToSql.JobCard origJobCard = db.JobCards.Single(jc => jc.JobID == model.InstallationDBNumber);
db.JobCards.Attach(entity, true);
db.SubmitChanges();
我怀疑这是因为我们正在使用Attach
,而不是实际更新附加实体。由于此更新由HttpPost操作方法调用,因此我们无法保持实体附加。我猜测如果我没有附加传入的实体,而是使用其值来更新附加的JobCard实体(从注释掉的行开始),我的审计服务将检测到正确的更改。
我的主要问题是:我是否必须遍历entity
的每个属性并在origJobCard
上设置相应的属性,或者某些合并操作可以在某处使用?
答案 0 :(得分:0)
我认为你已经在这里正确地确定了你的选项,除了可能有一个,这可能是也可能没有吸引力:与在http操作期间被序列化(分离)的原始实体一起,你可以发送一个干净的副本/克隆保持不变的同一个实体,当http操作完成时,你将脏的和干净的分离实体都传递给Attach(TEntity, TEntity)
方法。
循环遍历属性并将值从分离的实体复制到附加的实体(如您所建议的)可能实际上工作量较少(但效率不高,除非您在某处缓存columnProperties
并避免进行搜索并且结束了。
以下是循环方法的示例:
List<PropertyInfo> columnProperties = typeof(Employee).GetProperties()
.Where(p => p.GetCustomAttributes(typeof(ColumnAttribute), true).Any())
.ToList();
Employee employee1 = new Employee() { VacationHours = 100 };
Employee employee2 = new Employee() { VacationHours = 10 };
foreach (PropertyInfo pi in columnProperties)
{
object value = pi.GetValue(employee1, null);
pi.SetValue(employee2, value, null);
}
正如您所看到的,由于您的问题已接近六个月,我主要是为了编码/回答练习。干杯!
<强> [编辑] 强>
Automapper可能是另一种选择。或Automapper以及this answer and discussion中的专用视图对象。