【问题标题】:Linq not updating changed class propertyLinq 不更新更改的类属性
【发布时间】:2009-10-24 14:57:55
【问题描述】:

首先,我已经阅读了类似的帖子,但不知道他们是如何解决这个问题的。如果我遗漏了什么,请指出是什么。

我的 Linq 代码与 Scott Gu 的 expensiveUnpopularProducts example 非常相似。但是,就我而言,数据库并未使用新值进行更新。没有引发异常,并且所有变量似乎在调试器中都有合理的值(结果集填充,连接字符串正确,...)。

    using (MyDataContext db =
        new MyDataContext(CONNECTION_STRING))
    {
        var resultSet = from l in db.Logs
                            where l.ProcessCode == null
                            select l;

        foreach (var bm in resultSet)
        {
            bm.ProcessCode = 1;
            // Debugger shows bm.ProcessCode properly set
        }

        db.SubmitChanges();
    }

为什么 SubmitChanges() 不会导致数据库更新?

注意:这是我真实方法的简化案例。真实的也将记录插入到另一个表中。该插入工作正常,因此我确定连接字符串正确且正常运行。

【问题讨论】:

    标签: linq-to-sql


    【解决方案1】:

    编辑:查看this question 的答案。这也可能是你的答案。结果证明,除非表上有主键,否则 LINQ to SQL 不会进行更新。我敢打赌,您还需要在课堂上设置ColumnAttribute 的主键部分。由于您使用了代码生成器,您可能需要在更新数据库中的表后重新生成该部分。假设这是当然的问题。

    具有ProcessCode 属性的类是否实现INotifyPropertyChangedProcessCode 属性会触发PropertyChanged 事件吗?

    您还需要确保DataContextObjectTrackingEnabled 属性设置为true。它应该是默认的,但很容易检查。

    您还可以在DataContext 上使用GetChangeSet 方法来查看更新内容。它可以帮助调试。

    【讨论】:

    • 带有ProcessCode的类是Linq生成的。不知道生成的类是否实现了INotifyPropertyChange。
    • 我看到了关于拥有主键的问题。不过,我确实有一个。它被定义为唯一标识符而不是 int,但有一个 PK。
    • 变更集为空。 ObjectTrackingEnabled 为真。
    • 已解决! PK 没有以某种方式注册到 Linq。我从设计器中删除了相关表并重新添加它,更新开始工作。感谢您的帮助。
    【解决方案2】:

    我的第一个猜测是您的 Linq 查询将任何匹配元素的深度复制到结果集中。因此,当您执行 db.SubmitChanges() 时,您正在对另一个数据副本进行操作。如果你在 db.SubmitChanges() 之前下一个断点,你能看到 db 中的数据被正确更新了吗?

    【讨论】:

    • 否,根据调试器没有更新结果集。然而,根据 Scott 的博客(他是微软开发部门的公司副总裁,所以我希望他知道他在说什么),这种模式应该可以工作。如果这不是正确的模式,那是什么?
    • @Eric J. - 这是正确的模式。我们在整个应用程序中都使用了它,它运行良好。
    猜你喜欢
    • 1970-01-01
    • 2011-03-16
    • 2020-02-11
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多