2013-08-30 35 views
1

我有一个winforms客户端应用程序,它使用datacontext运行。 我现在遇到了一些并发问题,导致我的每个客户端都有自己的datacontext正在运行,并且在进行更改时,它们将更改存储在数据库中。但是,当用户A使Object_1一个变化,并存储在数据库中的变化,用户B不能看到用户A在object_1做出这些改变使用最新数据库值更新DataContext

  • 我要的是,与来自值更新Object_1数据库,每次用户打开object_1。

我已经尝试使用DataContext.Refresh方法,但它似乎没有用数据库值更新对象。 继承人的代码示例:

public void updateObj(object obj) 
    { 
     if (hvilken is Apartment) 
     { 
      try 
      { 
       DataContext.Refresh(RefreshMode.OverwriteCurrentValues, obj); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 
     if (hvilken is Customer) 
     { 
      try 
      { 
       DataContext.Refresh(RefreshMode.OverwriteCurrentValues, obj); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 
    } 

在实践中的任何方式最好,与数据库中的最新值更新的DataContext?

+0

请不要吞下例外。如果该代码抛出'',它抛出*的原因* –

+0

我正在调试代码,并且该方法不抛出异常。我的测试用例如下: 1.将值更改为机器A上的Obj1并保存到db 2.查看机器B上的Obj1 在机器上BI现在应该看到机器A输入的值,但我仍然得到机器A之前的“旧”值会更改该值。即使我使用刷新方法没有任何例外:/ – grmihel

回答

1

DataContext.Refresh模式不是通用的,所以在您的特殊套管中没有什么好处;而空的catch只是不好的做法(这可能确实是为什么你不知道为什么它不工作:它可能试图告诉你,但你忽略了它)。因此,在“最佳实践”的方式,你将简化:

public void UpdateObject(object obj) 
{ 
    DataContext.Refresh(RefreshMode.OverwriteCurrentValues, obj); 
} 

如果它不工作,它可能会throw告诉你为什么。

+0

嗯,我完全同意空括号是如此以往,是不好的做法。但这不是在这种情况下的捕获,因为我在调试模式下运行,并且该方法不会引发异常。 – grmihel

+0

但它不会更新映射到另一个表的关联导航集合属性。它只更新映射到当前实体指向的表的列的属性。 Linq to Sql有没有办法解决这个问题? – RBT