3

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

我正在开发一个使用 Fluent NHibernate 将数据存储在 SQLite 后端的项目。它的负载极低(启动时读取十几次左右,然后可能每分钟写入一次或 2 次作为高负载。)我正在尝试比其他任何东西更容易编写,所以我想要它所以我只需更改对象的属性,它就会自动将其刷新到后端。就像我说的,这是一个负载非常低的单用户应用程序,所以即使(最坏的情况)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,在应用程序的整个生命周期中都是静态的

有什么建议么?

4

3 回答 3

1

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

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

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

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

于 2012-12-30T14:25:55.753 回答
0

您需要做的就是刷新会话。以下示例来自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

请注意,文档还指出在其他时候会发生自动刷新(即您不必像前面提到的示例那样启动它)。这对您来说是个好消息,因为这实际上就是您正在寻找的东西。

于 2012-12-30T00:24:46.333 回答
0

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

于 2012-12-30T14:09:41.703 回答