Je suis confronté à un comportement inhabituel avec le dépôt et les transactions et c'est de me rendre fou.S # arp Architecture Repository.DbContext.CommitTransaction() comportement inhabituel
J'ai deux classes POCO simples Action et Version comme suit. Il y a une relation un à plusieurs dans 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()
{
}
}
Maintenant, j'ai un segment de code comme suit:
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();
}
Dans le code ci-dessus, je suis juste en train de créer des référentiels d'action et Version. Je persiste d'abord dans un objet Action en utilisant le référentiel d'actions. Ensuite, je commence une transaction en utilisant le référentiel Version, créer une nouvelle version, définir références avec l'action, et valider la transaction sans en appelant réellement Référentiel de versions.
Le résultat est un peu étrange. L'objet version est conservé même bien que je n'ai pas appelé la méthode SaveOrUpdate sur le référentiel de versions. Si je commente la ligne act1.AddVersion (v1); Dans la transaction, , la version n'est pas persistante.
Après un peu de lutte J'ai testé le même scénario en utilisant NHibernate directement au lieu d'utiliser des référentiels de Sharp en utilisant l'architecture même cartographie Fluent/configuration (AutoPersistenceModelGenerator.Generate()). Et le résultat est attendu. L'objet version n'est pas conservé. Voici le code
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();
}
}
La méthode CreateSessionFactory() est la suivante. Rien de compliqué
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();
}
maintenant Si sombody pourrait s'il vous plaît laissez-moi savoir pourquoi j'ai ce comportement . Ça me rend fou.
Juste pour que vous sachiez que je n'ai pas outrepassé le mapping pour Action et Version non plus.
En attente Nabeel
tl; dr. Pouvez-vous le réduire en moins de mots? –
Désolé pour ça Mauricio. En fait, je l'ai posté sur S # arp Architecture google liste de diffusion, et j'ai copié un peu collé à partir de là. – nabeelfarid