我正在尝试在通用存储库中创建一个更新方法作为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();
}
但我一直得到同样的例外:
如果实体只能在没有原始状态的情况下附加修改 它声明版本成员或没有更新检查策略。
那么问题是什么?
除了将时间戳列创建为版本号之外,您是否建议在通用存储库中创建更新方法的任何其他方法。
答案 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也是合乎逻辑的。