2009-12-10 45 views
0

我正在开发一个WPF应用程序(.NET 3.5SP1)。场景是这样的:LINQ to SQL更新WPF应用程序中的问题

1.使用SQL Metal提取实体定义(和相应的映射文件),后来用于数据访问层(所以我使用LINQ to SQL)。

2.使用Unity(此应用程序是“基于PRISM的”)来注册抽象类及其相应的实现(例如IRepository和ActualRepository,IDataContext和ActualContext,IUnitOfWork和ActualUnitOfWork等等 - 类名是不是真正的,但这里并不重要)

3.MVVM样式用于创建ViewModel和View。

插入和删除工作得很好..但后来我发现这个怪异的行为:

一)通过创建一个新的记录,并填写一些字段的用户能够保存这个(新)记录只有一次! !如果用户忘记将某些数据插入其他字段并尝试保存此记录(再次),则这些更改不会反映在dbms中!

因此,用户关闭了应用程序,再次打开应用程序并加载(之前插入的)记录。现在:每次更改这些记录实际上反映到dbms!

我认为它必须与DataContext的问题(这是创建这样:

public SQLDataContext(string connectionString) 
     { 
      dc = new DataContext(connectionString, Mapping.GetMapping()); 
     } 

我做了一些谷歌搜索,发现关于分离对象的一些问题。我不确定这是否与我的情况有关,但是阅读一些博客我明白它必须!

长话短说:我以为我在我的表中使用时间戳字段。 b)Said ..done!Et瞧:新创建的记录在第一次保存后可以保存多次。即使关闭和重新开放应用程序工作正常!

但是:araised一个新问题!

一个视图使用了一些组合框。只要我们播放的这条记录是实际记录,绑定到这些组合框的字段就会正确更新。当我们移动到下一个记录时,之前的当前记录将其字段(绑定到组合框)分配给null!我认为这是一个具有约束力的问题,并且很明显地在组合框中放置了双向绑定模式,但没有结果。

这让我疯狂! (在情况a)我没有遇到这些问题!!!!)

绑定到TextBoxes的字段按预期工作! 顺便说一句:我没有得到任何绑定错误!

所以:有人可以解释为什么情况a)的行为是这样吗?为什么b)绑定到WPF组合框的字段表现如此呢?

在此先感谢

回答

0

如果你再使用LINQ to SQL的上下文保存后选择,不这样做。

最佳做法是,创建一个新的上下文的插入/更新/删除,包裹在一个使用:

using(var dc = new DataContext()) 
{ 
    // Delete/Change/Insert some objects 

    dc.SaveChanges(); 
} 

创建结合

+0

问题兹是另一个新DataContext实例时(重新)我创建Datacontext这样: using(IUnitOfWork unitOfWork = UnitOfWork.Begin()) { unitOfWork.Commit(); } 和UnitOfWork.Begin()被以这种方式定义: 公共静态IUnitOfWork开始() { 返回ServiceLocator.Current.GetInstance (); } 正如我上面所说,我使用的是团结。所以我担心的是Unity会始终返回相同的上下文! – 2009-12-11 07:24:45

+0

您是否正在使用单独的工作单位进行保存和提取? – 2009-12-11 13:15:41

+0

我认为我找到了解决我的问题(谷歌搜索多一点后): a)删除时间戳字段 b)保存记录涉及检查(在UnitOfWork.Begin()后): if(newRecord){add (object)} else {refresh(object)}; commitWork(); 希望这是固定的! 但我仍然有这个问题与组合框! – 2009-12-11 16:10:45