4

我正在尝试在通用存储库中创建一个更新方法作为 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正如@jeff Atwood 在这篇文章中建议的那样,我为 id 的所有字段设置了除此之外的所有字段asModified,并将 attach 方法中的属性设置为 true,我在这篇文章中发现如下:

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

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

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

所以有什么问题 ???

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

4

2 回答 2

2

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

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

ReadOnlyDataContext 有 TrackChanges = false;

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

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

于 2011-12-26T05:32:49.337 回答
0

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

你永远不知道对象之前是否没有被加载到上下文中,如果是的话,在附加它时你会得到一个异常。至少 EF 是这样,但 linq for sql 也是合乎逻辑的。

于 2011-11-03T11:06:42.067 回答