自动将数据刷新到数据库

3
我非常确定这只是我不知道要搜索什么,所以请随意指向正确的术语,以下是翻译内容:
我正在开发一个项目,使用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个回答

1

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

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

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

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


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

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

我刚刚设置了代码,没有进行任何刷新或其他操作,但它没有保存。我正在寻找几乎立即保存的方式,可能通过某种事件或其他方式。再次强调的问题是我不太了解 NHibernate。 - Andrew Leap
请在您的问题中编辑一组相关摘录。例如,请发布其中一个模型,以及更新该模型的一组代码,这将为我提供您如何使用它们的整体概述。当然,必要时更改名称以保护无辜者。 - Mike Perrenoud

0

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


尝试避免绑定数百个事件。理想目标只是在属性设置时进行简单的保存。 - Andrew Leap
什么平台?通常情况下,您会通过几行代码循环遍历控件并订阅更改事件处理程序。另一种选择是在对象上实现INotifyPropertyChanged,这类似于您的“大量额外代码”解决方案。该对象应该是持久性无知的,即不引用NHibernate。TANSTAAFL。 - Jamie Ide
不明白INotifyPropertyChanged有什么用处,因为我认为它只是通知控件等内容发生了改变,而事件处理程序也不能解决代码以外的控件修改属性的问题。 - Andrew Leap
正确实现INotifyPropertyChanged会在对象中的任何属性更改时引发PropertyChanged事件。然后,您可以附加处理程序到事件并在其引发时刷新会话。实现它是很繁琐的工作。大多数应用程序都会提供一个保存按钮,允许用户在数据应该保存时通知应用程序。 - Jamie Ide

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接