自动将数据刷新到数据库

时间:2012-12-30 00:18:46

标签: c# nhibernate fluent-nhibernate

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是一个在应用程序生命周期内是静态的ISession

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

您需要做的就是冲洗会话。以下示例来自nHibernate Reference Documentation

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

请注意,文档还说明有时会发生自动刷新(即您不必像上述示例那样启动它)。 这对你来说是个好消息,因为那实际上就是你要找的东西。

答案 2 :(得分:0)

您没有说明您正在开发的平台,但总的来说,因为您正在使用数据绑定,最简单的方法是将事件处理程序附加到每个控件的更改中事件。触发更改的事件时,数据绑定对象已更改,然后您可以将更改刷新到数据库。