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
有什么建议吗?
答案 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)
您没有说明您正在开发的平台,但总的来说,因为您正在使用数据绑定,最简单的方法是将事件处理程序附加到每个控件的更改中事件。触发更改的事件时,数据绑定对象已更改,然后您可以将更改刷新到数据库。