【问题标题】:LINQ to SQL Field Won't Update (Sometimes)LINQ to SQL 字段不会更新(有时)
【发布时间】:2011-04-14 16:00:56
【问题描述】:

我有一个使用以下方法的 MVC Web 应用程序:

public class MyController : Controller
{
    public FooRepository fooRepository = new FooRepository();
    public BarRepository barRepository = new BarRepository();

    public ActionResult UpdateItems(int id, int range1, int range2)
    {       
        Foo foo = fooRepository.GetItem(id);
        List<Bar> bars = barRepository.GetItemsByRange(range1, range2);

        // Some validation rules here...

        DoSomeWork(foo, bars);

        // Show confirmation / error message
    }

    private void DoSomeWork(Foo foo, List<Bar> bars)
    {
        foreach(int i = 0; i < bars.Count; i++)
        {
            bars[i].Prop1 = foo.Prop1; // This field is updated
            bars[i].Owner = "someuser"; // This one too
            bars[i].Status = BarStatus.SomeStatus; // This isn't...
        }
        foo.Status = FooStatus.SomeStatus; // Ok

        // Calls DataContext.SubmitChanges()
        fooRepository.SubmitChanges();
        barRepository.SubmitChanges();      
    }
}

但是,在某些“随机” 情况下(我看不到任何模式),其中一个字段没有得到更新,如 cmets 中所述。

似乎 LINQ 无法识别该字段的更新,因此它被排除在生成的查询之外。

谁能告诉我如果我在这里遗漏了什么,可能是什么原因造成的和/或我该如何解决?

注意:我没有得到任何异常,也无法在开发场景中验证这种情况。

【问题讨论】:

  • 可以复制粘贴实际代码吗?

标签: c# asp.net-mvc linq-to-sql sql-server-2000 datacontext


【解决方案1】:

根据我的经验,如果错误是随机的并且您无法在开发中重现,那么问题是用户错误。

如果 .net 框架或 CLR 只是随机决定以不同的方式做事,那么编程将非常困难。

【讨论】:

  • 好吧,我很想这么说,但实际上我正在观察这件事的发生。我想知道的是,如果 LINQ To SQL 有什么我不知道或在这里遗漏的特别之处......
【解决方案2】:

你可能有一个隐式/显式绑定排除在某处浮动

[Bind(Exclude="...,Status,...")]

当然只是猜测

【讨论】:

  • 我查了一下,没有找到。更新成功率接近 97%,所以我不认为这是一个例外。还是谢谢!
【解决方案3】:

如果 Linq 认为 Status 已经是 BarStatus.SomeStatus,那么它不会更新它。

可能发生的情况是,您找到一条状态设置为该值的记录,然后其他一些例程对其进行更改,然后,如果您使用相同的 DataContext,您将从缓存副本中获取旧值,然后因此 Linq 认为它不需要更新它。

【讨论】:

  • 我认为可能是这样的,但是“barRepository.GetItemsByRange”方法已经选择了 Status BarStatus.SomeStatus 所在的行。状态仅在此操作中更改,并且只有一个用户可以更新给定的一组“栏”。这让我发疯了!
  • 在这种情况下,在您的循环中,我会明确检查 bar[i].Status != BarStatus.SomeStatus 并记录错误或在发生时抛出异常。这可能无助于找到问题的原因,但至少应该将其排除为可能的原因。
  • 好建议。另外,什么是 BarStatus 的类型?我们期望它是枚举类型,但它也可以是任何具有静态成员“SomeStatus”的类类型
  • BarStatus 是一个枚举,我会按照 sgmoore 的建议去做,以防万一。我会继续搜索,并会发布我发现的任何内容。谢谢!
猜你喜欢
  • 1970-01-01
  • 2010-09-28
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 2012-06-26
相关资源
最近更新 更多