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

我正在尝试在通用存储库中创建一个更新方法作为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; } .... } 

我为所有为id执行的字段设置了Update Check = true @jeff Atwood在这篇文章中建议我将attach方法中的asModified属性设置为true,我在本文中发现如下:

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

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

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

所以有什么问题 ???

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

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

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

ReadOnlyDataContext具有TrackChanges = false;

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

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

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

您永远不知道该对象之前是否尚未加载到上下文中,如果是,则无论如何都会在连接时获得exception。 至少EF是这种情况,但对于sq来说,linq也是合乎逻辑的。