Может ли NHibernate определять, когда другая программа записывает новые данные в общую базу данных SQLite? - PullRequest
1 голос
/ 22 июля 2010

У меня есть две программы на C #, которые используют один файл базы данных SQLite.

Одна программа (назовем это Writer) записывает новые данные в базу данных. Другая программа (Reader) читает его. Обе программы используют Fluent NHibernate и System.Data.SQLite для доступа к БД.

В настоящее время у меня есть большая кнопка «Обновить» в моей программе Reader, и пользователь должен щелкнуть ее, чтобы получить все новые данные, которые были записаны в БД с момента последнего обновления. Это работает, но вряд ли элегантно.

Есть ли способ заставить NHibernate запустить событие в программе Reader, когда DB обновляет Writer, чтобы я мог автоматически представлять новые данные пользователю? (Я посмотрел документы NH для перехватчиков и событий, но не было ясно, будут ли они делать то, что я хочу)

Или есть ли хороший способ опроса обновлений с использованием NH?

Если решение NH не сработало, могу ли я сделать нечто подобное с System.Data.SQLite или с помощью другого механизма более низкого уровня?

Ответы [ 3 ]

1 голос
/ 22 июля 2010

Вы можете поместить System.IO.FileWatcher в общий файл.Это скажет вам, когда он был обновлен.

1 голос
/ 22 июля 2010

Я думаю, что Перехватчик или Событие на стороне писателя было бы правильным решением для этого. В нашем текущем проекте мы сделали нечто похожее, и оно прекрасно работает.
Используя этот подход, вы сохраняете возможность переключать базу данных ниже или отображение и можете разработать свое событие обновления из простого триггера TableUpdate, который, я думаю, должно быть сделано за несколько часов, до конкретного события обновления, содержащего все измененные данные.

EDIT:

Прежде всего, я бы не только отслеживал 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 remoting. Есть несколько примеров, как это сделать. Простой можно найти здесь . Или, если вы хотите попробовать WCF, смотрите здесь . Или ищите ТАК, здесь можно найти много хороших примеров.

0 голосов
/ 22 июля 2010

Вот некоторый пример кода, который использует FileSystemWatcher, как предложено Джоном Рейнером ...

     // 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...