我正面临存储库和事务的异常行为,这让我很生气。
我有两个简单的 POCO 类 Action 和 Version 如下。Action->Version 是一对多的关系。
public class Action : Entity
{
public virtual string Name
{
get;
set;
}
public virtual IList<Version> Versions
{
get;
protected set;
}
public Action()
{
Versions = new List<Version>();
}
public virtual void AddVersion( Version version )
{
version.Action = this;
Versions.Add( version );
}
}
public class Version : Entity
{
public virtual int Number
{
get;
set;
}
public virtual Action Action
{
get;
set;
}
public Version()
{
}
}
现在我有一个代码段如下:
var actionRep = new Repository<Action>();
var versionRep = new Repository<Version>();
var act1 = new Action( );
actionRep .SaveOrUpdate( act1 );
using (versionRep .DbContext.BeginTransaction())
{
var v1 = new Version();
act1.AddVersion( v1 );
//versionRep .SaveOrUpdate( v1 );
versionRep .DbContext.CommitTransaction();
}
在上面的代码中,我只是创建了 Action 和 Version 存储库。首先,我使用 Action Repository 持久化一个 Action 对象。然后我使用 Version repository 开始一个事务,创建一个新版本,使用 Action 设置引用,并在没有实际调用 Version Repository 的情况下提交事务。
结果有点奇怪。即使我没有在版本存储库上调用 SaveOrUpdate 方法,版本对象也会被保留。如果我注释掉行 act1.AddVersion( v1 ); 在事务中,则版本不会被持久化。
经过一番努力,我直接使用 NHibernate 测试了相同的场景,而不是使用相同的流畅映射/配置 (AutoPersistenceModelGenerator.Generate()) 使用 Sharp Architecture 存储库。结果和预期的一样。版本对象不会被持久化。这是代码
var sessionFactory = CreateSessionFactory();
_act1 = new Action();
using( var session = sessionFactory.OpenSession() )
{
session.SaveOrUpdate( _act1 );
}
using( var session = sessionFactory.OpenSession() )
{
using (var transaction = session.BeginTransaction())
{
_v1 = new Version();
_act1.AddVersion( _v1 );
//session.SaveOrUpdate( _act1 );
transaction.Commit();
}
}
CreateSessionFactory() 方法如下。没什么复杂的
private const string _dbFilename = "nhib_auditing.db";
private static ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database( SQLiteConfiguration.Standard
.UsingFile( _dbFilename )
.ShowSql())
.Mappings( m => m.AutoMappings.Add( new
AutoPersistenceModelGenerator().Generate() ) )
.ExposeConfiguration( BuildSchema )
.BuildSessionFactory();
}
现在,如果有人可以请让我知道我为什么会有这种行为。它让我很生气。
只是为了让您知道我也没有覆盖 Action 和 Version 的映射。
等待纳比尔