合并LINQ to SQL实体中的更改

时间:2010-08-06 12:50:51

标签: linq-to-sql

我有以下代码来更新从强类型视图返回的JobCard对象。但是,使用JobCard实体调用GetModifiedMembers会返回JobCard的每个属性,CurrentValueOriginalValue都会设置为当前值。

    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上设置相应的属性,或者某些合并操作可以在某处使用?

1 个答案:

答案 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中的专用视图对象。