我发现我认为Ayende为great article创建了一个简单的基础测试夹具,用于使用SQLite进行NHib单元测试。
我的问题是具体测试夹具中的测试用例代码。在下面的EX_1中,Ayende包含了他提交的事务中的保存提取,并且在它们之间有一个Session.Clear。这当然有效,但EX_2也是如此。
所有条件相同我更喜欢更紧凑,更易读的EX_2。有关为什么EX_1中的附加代码值得一点混乱的想法?
干杯,
Berryl
==== EX_1 =====
[Fact]
public void CanSaveAndLoadBlog_EX_1()
{
object id;
using (var tx = session.BeginTransaction())
{
id = session.Save(new Blog
{
AllowsComments = true,
CreatedAt = new DateTime(2000,1,1),
Subtitle = "Hello",
Title = "World",
});
tx.Commit();
}
session.Clear();
using (var tx = session.BeginTransaction())
{
var blog = session.Get<Blog>(id);
Assert.Equal(new DateTime(2000, 1, 1), blog.CreatedAt);
Assert.Equal("Hello", blog.Subtitle);
Assert.Equal("World", blog.Title);
Assert.True(blog.AllowsComments);
tx.Commit();
}
}
==== EX_2 =====
[Fact]
public void CanSaveAndLoadBlog_EX_2()
{
var id = session.Save(new Blog
{
AllowsComments = true,
CreatedAt = new DateTime(2000, 1, 1),
Subtitle = "Hello",
Title = "World",
});
var fromDb = session.Get<Blog>(id);
Assert.Equal(new DateTime(2000, 1, 1), fromDb.CreatedAt);
Assert.Equal("Hello", fromDb.Subtitle);
Assert.Equal("World", fromDb.Title);
Assert.True(fromDb.AllowsComments);
}
答案 0 :(得分:1)
我相信NHibernate即使您只是在查询时也鼓励使用交易。请查看此文章http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions。
此外,您的EX_2代码可能无法访问数据库,具体取决于您使用的主键类型。如果您正在使用自动增量的Identity密钥,NHibernate将访问数据库并获取主键,但如果您使用guid,guid.comb或hilo,则根本不会访问数据库。所以你的Get会抓住NHibernate在内存中缓存的内容,除非你做一个提交更改然后清除会话,这样你才知道内存中没有任何内容。