NHibernate能否检测到另一个程序何时将新数据写入共享SQLite数据库?

时间:2010-07-21 21:02:11

标签: nhibernate sqlite

我有两个共享一个SQLite数据库文件的C#程序。

一个程序(让我们称之为Writer)将新数据写入数据库。另一个程序(Reader)读取它。两个程序都使用Fluent NHibernate和System.Data.SQLite来访问数据库。

目前,我的Reader程序上只有一个很大的刷新按钮,用户必须单击它才能获取自上次刷新以来写入数据库的任何新数据。这很有效,但很不优雅。

当Writer更新数据库时,有没有办法让NHibernate在Reader程序中触发事件,这样我就可以自动向用户显示新数据了? (我查看了NH拦截器和事件的文档,但目前尚不清楚这些是否符合我的要求)

或者,有没有一种使用NH轮询更新的好方法?

对于NH解决方案失败,我可以使用System.Data.SQLite或其他更低级别的机制执行类似的操作吗?

3 个答案:

答案 0 :(得分:1)

我认为作家方面的拦截器或事件将是正确的解决方案。在我们目前的项目中,我们做了类似的事情并且工作得很好 使用这种方法,你可以保持在下面或映射下切换数据库的能力,并且可以从简单的“TableUpdate”触发器中详细说明你的更新事件,我认为应该在几个小时内完成一个包含所有更改的具体Update-Event数据

编辑:

首先,我不仅会跟踪OnSave,还会跟踪AfterTransactionCompleted,以确保交易已经完成。这也使您可以收集tx的所有对象。 最简单的方法是覆盖EmptyInterceptor对象,如下所示:

public class EntityInterceptor : EmptyInterceptor
{
    private IList<object> entities = new List<object>();

    public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)
    {
        entities.Add(entity);
        return base.OnSave(entity, id, state, propertyNames, types);
    }

    public override void AfterTransactionCompletion(ITransaction tx)
    {
        if (tx.WasCommitted)
        { 
            Console.WriteLine("Data has been inserted. Notify the reader here.");
        }
        entities = new List<object>();
    } 
}

进程间通信IMO最直接的方法是.net远程处理。有几个例子如何做到这一点。可以找到一个简单的here。或者,如果您想尝试WCF,请参阅here。或者搜索SO,可以在这里找到很多好的例子。

答案 1 :(得分:1)

您可以将System.IO.FileWatcher放到共享文件中。这会告诉你什么时候更新。

答案 2 :(得分:0)

以下是一些使用FileSystemWatcher的示例代码,如John Rayner所建议的那样......

     // Watches for writes to database file
    private static FileSystemWatcher _dbFileWatcher;

    /// <summary>
    /// Set up an event handler that is called when SQLite database is written to.
    /// </summary>
    /// <param name="onChangedHandler"></param>
    public static void SetupSqliteDatabaseWatcher(FileSystemEventHandler onChangedHandler)
    {
        // Create a new FileSystemWatcher and set its properties.
        _dbFileWatcher = new FileSystemWatcher
                             {
                                 Path = "<directory containing DB file>",
                                 Filter = "<DB file>.db",
                                 NotifyFilter = NotifyFilters.LastWrite
                             };

        // Add the event handler
        _dbFileWatcher.Changed += onChangedHandler;

        // Begin watching.
        _dbFileWatcher.EnableRaisingEvents = true;
    }

    // Event handler
    private static void OnDbWritten(object source, FileSystemEventArgs e)
    {
        Debug.Print("DB written");
    }


    // Set up the event handler
    SetupSqliteDatabaseWatcher(OnDbWritten);