使用DataContext Attach方法更新实体时更新检查'问题

时间:2011-10-07 07:45:17

标签: c# linq-to-sql updatecheck

我正在尝试在通用存储库中创建一个更新方法作为LINQ to SQL数据访问层。

我有一个这样的实体:

[Table]
public class Product
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true, 
     DbType = "Int NOT NULL IDENTITY")]
    public int Id { get; private set; }
    [Column(UpdateCheck = UpdateCheck.Never)]
    public string Name { get; set; }
    ....
}

我设置Update Check = true代表id的所有字段,如@jeff Atwood在this post中建议的那样,我将attach方法中的asModified属性设置为true,我在{ {3}}如下:

public void Update(T entity)
{
    _db.GetTable<T>().Attach(entity, true); 
    _db.SubmitChanges();
}

但我一直得到同样的例外:

  

如果实体只能在没有原始状态的情况下附加修改   它声明版本成员或没有更新检查策略。

那么问题是什么?

除了将时间戳列创建为版本号之外,您是否建议在通用存储库中创建更新方法的任何其他方法。

2 个答案:

答案 0 :(得分:2)

我们在DAO中使用以下代码来解决同样的问题:
(例如,目前我没有真正的代码)

public void UpdateUser(tblUser user)
{
   WriteDataContect.Attach
   (
      user,
      ReadOnlyDataContext.tblUsers
                         .Select(o => o.UserId == user.UserId)
   );
   WriteDataContext.SubmitChanges();
}

ReadOnlyDataContext具有TrackChanges = false;

我们无法根据我们的需求找到另一种解决方案,而无需编写大量的管道代码。 修改数据库以满足LinqToSql对时间戳列的需求也不是我们的选择。

额外的数据库调用在我们的测试中没有产生任何问题。

答案 1 :(得分:0)

您可以从db读取实体并复制字段。我不喜欢这种方法,但在处理类似问题时我们必须这样做。

你永远不知道对象之前是否还没有被加载到上下文中,如果是这样的话,无论如何你都会得到异常。至少EF是这种情况,但对于sq来说,linq也是合乎逻辑的。