【问题标题】:Update check' issue when updating an entity using DataContext Attach method使用 DataContext Attach 方法更新实体时出现更新检查问题
【发布时间】:2011-10-07 07:45:16
【问题描述】:

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

我为@jeff Atwood 在this post 中建议的所有字段设置了Update Check = true,并将attach 方法中的asModified 属性设置为我在this post 中找到的true,如下所示:

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

但我总是遇到同样的异常:

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

那有什么问题???

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

【问题讨论】:

    标签: c# linq-to-sql updatecheck


    【解决方案1】:

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

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

    ReadOnlyDataContext 有 TrackChanges = false;

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 2015-03-26
        • 1970-01-01
        • 2017-05-27
        • 1970-01-01
        • 2013-02-28
        相关资源
        最近更新 更多