LINQ to SQL字段不会更新(有时)

时间:2011-04-14 16:00:57

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

我使用以下方法获得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();      
    }
}

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

似乎LINQ没有识别该字段的更新,因此它会从生成的查询中排除。

任何人都可以告诉我,如果我在这里遗漏了什么,可能是什么导致它和/或我该如何解决?

注意:我没有得到任何异常,也无法在开发方案中验证此情况。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您可能在某处隐藏/显式绑定排除

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

当然猜测

答案 2 :(得分:0)

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

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