Кстати, вот мои два теста, один с SharpRepositories, который не работает, и с NHibernate Directly, который проходит.
[TestFixture]
public class RepositoryTests : RepositoryTestsBase
{
protected override void LoadTestData()
{
}
[Test]
public void TestUsingSharpRespositories
{
var aRep = new Repository<Action>();
var vRep = new Repository<Version>();
_act1 = new Action();
aRep.SaveOrUpdate( _act1 );
using( vRep.DbContext.BeginTransaction() )
{
_v1 = new Version();
_act1.AddVersion( _v1 );
//vRep.SaveOrUpdate(_v1);
vRep.DbContext.CommitTransaction();
}
_v1.IsTransient().ShouldBeTrue();
}
[Test]
public void TestUsingNHibernateSession
{
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 );
transaction.Commit();
}
}
_v1.IsTransient().ShouldBeTrue();
}
private const string _dbFilename = "nhib_db.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();
}
private static void BuildSchema( Configuration config )
{
if( File.Exists( _dbFilename ) )
File.Delete( _dbFilename );
new SchemaExport( config ).Create( false, true );
}
}
Я новичок в Fluent NHibernate, и я никогда не использовал NHibernate напрямуюс сопоставлением xml.
Что касается сопоставления, я использую конфигурацию автоматического преобразования, которая настраивается при создании нового проекта Sharp Architecture в visual studio.У меня есть соглашение для HasMany:
public class HasManyConvention : IHasManyConvention
{
public void
Apply( FluentNHibernate.Conventions.Instances.IOneToManyCollectionInstance
instance )
{
instance.Key.Column( instance.EntityType.Name + "Fk" );
instance.Inverse();
instance.Cascade.All();
}
}
Я обновил свой тест TestUsingNHibernateSession следующим образом, чтобы проверить, как он ведет себя, если я манипулирую как действием, так и версией в одном сеансе.И угадайте, что, объект Version будет сохранен, даже если между началом транзакции и подтверждением нет ничего.
[Test]
public void TestUsingNHibernateSession
{
var sessionFactory = CreateSessionFactory();
_act1 = new Action();
using( var session = sessionFactory.OpenSession() )
{
session.SaveOrUpdate( _act1 );
//}
//using( var session = sessionFactory.OpenSession() )
//{
_v1 = new Version();
_act1.AddVersion( _v1 );
using (var transaction = session.BeginTransaction())
{
transaction.Commit();
}
}
_v1.IsTransient().ShouldBeTrue();
}
Итак, я пришел к выводу, что все это связано с сеансом.Если объект A был создан или извлечен в сеансе, а затем, если в этом сеансе начинается новая транзакция, то, как только эта транзакция будет зафиксирована, все временные или грязные объекты, связанные с объектом A, также будут сохранены, нетнезависимо от того, создаются ли объекты внутри или за пределами Begin and Commit.
Может кто-нибудь сообщить мне, согласны ли они с моим пониманием?И я также предполагаю, что архитектура Sharp использует один сеанс nhibernate для каждого веб-запроса?
В ожидании Набиль