2010-01-02 53 views
1

在我的WPF应用程序中,我实现了LINQ to SQL查询,它填充了一个与ListView连接的Observable集合。它是在这种方法,我可以从somwhere调用,它工作正常:如何使用LINQ to SQL类的PropertyChangedEventHandler进行即时更新?

private void VisualizeAllShows() 
{ 

    MyfirstdbDataContext context = new MyfirstdbDataContext(); 
    _ShowQuCollection.Clear(); 

    var sh = from p in context.Shows select p; 

    foreach (var p in sh) 
     _ShowCollection.Add(new ShowsQu 
     { 
      Date = p.Date, 
      Time = p.Time, 
      Description = p.Description 
     });     
} 

现在我需要此更新自动发生数据库表数据更改。

我应该为此目的而使用这个公共事件在我的LINQ to SQL类:

public event PropertyChangedEventHandler PropertyChanged; 

如果是这样,请,如何使用事件处理程序这将火从数据变化? 如果不是,我应该在哪里寻找正确的方法来做到这一点?

回答

2

据我所知,没有什么来自数据库引擎,通知您的应用程序更新SQL服务器上的表。最好的选择是在SQL Server上使用CLR集成来添加它,请参阅#3。

以下是我能想到的选项: 1.通过重复查询数据库来检查更改以查询更改。 2.我已经看到SqlCacheDependancy用于这个,但从我读的是CPU密集型。 3.将CLR程序集添加到在触发器中实现了代码的SQL Server中,以便更新随后运行.NET代码,通知您的应用程序更新。如果你能够得到这个工作,它可能是最有效的。我不确定在编写用于SQL Server上的CLR集成的.NET代码时有什么限制。即无论它是否允许您连接到外部应用程序。您如何沟通可能因网络技术,TCP/IP,WCF,远程处理等不同而不同。

+0

我喜欢使用SQLCLR触发器发布更改通知的想法。我让客户将更改通知发布到WCF服务,该服务基本上为每个其他客户端保留一个阻塞队列通知。它的规模很好(因为请求实际上一直在阻塞),但它依赖于客户端的合作。 – Josh 2010-01-02 13:56:26

2

如果ShowsQu对象的属性发生更改,则使用INotifyPropertyChanged.PropertyChanged事件。 ObservableCollection已经实现INotifyCollectionChanged来通知其内容何时更改。

你说的是数据库中的更改会自动触发刷新集合。所以PropertyChanged事件在这里不适用。

你想要做的事情可能会变得非常复杂。最简单的(也是最不可伸缩的)解决方案是在定时器上轮询表。我过去所做的是使用“广播”机制,其中每个客户端都调查一个阻塞的WCF服务,直到事件可用。然后,当任何客户端更新数据库时,他们会向所有其他客户端广播一个事件,让他们知道他们应该刷新其UI。这种通知在你的情况下可能是过度的,并且在我的回答中肯定也是深入的。但希望它能指向正确的方向。