自动将数据刷新到数据库

本文关键字:数据库 刷新 数据 | 更新日期: 2023-09-27 17:49:49

99%肯定这只是我不知道该搜索什么,所以请随时为我指出正确的术语,但这里。

我正在做一个使用Fluent NHibernate在SQLite后端存储数据的项目。它的负载极低(在启动时大约有十几次读取,然后可能每分钟写一次或两次,这是高负载)。我想让写起来更简单,我想让对象的属性发生改变它会自动刷新到后端。就像我说的,这是一个非常低负载的单用户应用程序,所以即使(最坏的情况)每秒5个写入也不会那么明显。

我知道我可以在属性设置中设置保存,但我试图减少冗余代码,这对我来说似乎过于冗余。

我要找的是这样的东西

class MainConfig
{
    public virtual bool Enabled { get; set; }
}

然后能够将它绑定到一个控件上,这样对控件的更改就会击中属性,然后它就被保存了

使用大量额外的代码,我可以完成它

class MainConfig
{
    bool _Enabled;
    public virtual bool Enabled
    {
        get { return _Enabled; }
        set { _Enabled = value; mainSession.Save() }
    }
}

其中mainSession是一个会话,在应用的整个生命周期中都是静态的

有什么建议吗?

自动将数据刷新到数据库

这不是完美的解决方案,但我想到的是一个T4模板,处理每个配置对象,并为它和它的所有属性构建代理。

class MainConfigProxy : MainConfig
{
    public override Enabled
    {
         get { return base.Enabled; }
         set
         {
             base.Enabled = value;
             mainSession.Save();
         }
    }
}

,然后构建一个类型到类型的字典,其中包含基类及其代理。

然后我的代码检查字典,如果有代理,则加载/实例化它。不完美,但是节省了很多输入

您需要做的就是刷新会话。下面的例子来自nHibernate参考文档。

sess = sf.OpenSession();
ITransaction tx = sess.BeginTransaction();
sess.FlushMode = FlushMode.Commit; //allow queries to return stale state
Cat izi = (Cat) sess.Load(typeof(Cat), id);
izi.Name = "iznizi";
// execute some queries....
sess.Find("from Cat as cat left outer join cat.Kittens kitten");
//change to izi is not flushed!
...
tx.Commit(); //flush occurs

请注意,文档还指出,在其他时候会发生自动刷新(例如,您不必像前面提到的示例那样启动它)。

这对你来说是个好消息,因为这实际上是你正在寻找的

您不需要说明针对哪个平台进行开发,但是由于通常使用的是数据绑定,因此最简单的方法是将事件处理程序附加到每个控件的更改事件。当更改的事件触发时,数据绑定对象已经更改,然后可以将更改刷新到数据库中。