Mon mappage automatique de domaine fonctionnait mais maintenant que je mettais à jour ma pile NHibernate, je recevais une exception de mappage lorsque Session Factory est en construction Configuration:Impossible de comprendre l'autre côté de la propriété many-to-many 'Users'
« ne peuvent pas comprendre ce que l'autre côté des nombreux à plusieurs propriétés « utilisateurs » devrait être. »
L'exception est levée sur une carte plusieurs à plusieurs
Toute trace de pile est celui-ci:
à FluentNHibernate.Cfg.FluentConfiguration.BuildConfiguration() dans
c : \ hornget.horn \ orm \ fluentnhibernate \ Travailler-2.1 \ src \ FluentNHibernate \ Cfg \ FluentConfiguration.cs: ligne 119 à
WebApplication1.NHibernateManager.Session FactoryManager.BuildConfiguration (AutoPersistenceModel
persistanceModel) dans
C: \ WebProgramming \ Projects \ WebApplication1 \ WebApplication1 \ NHibernateManager \ SessionFactoryManager.cs: ligne 116 à
WebApplication1.NHibernateManager.SessionFactoryManager.GetSessionFactory() dans
C: \ WebProgramming \ Projects \ WebApplication1 \ WebApplication1 \ NHibernateManager \ SessionFactoryManager.cs: ligne 71 à
WebApplication1.NHibernateManager.SessionManager.CloseSession()
dans C: \ WebProgramming \ Projects \ WebApplication1 \ WebApplication 1 \ NHibernateManager \ SessionManager.cs: ligne 47 à
WebApplication1.Global.Application_EndRequest (expéditeur d'objet, EventArgs e) dans
C: \ WebProgramming \ Projects \ WebApplication1 \ WebApplication1 \ Global.asax.cs: ligne
36 à
System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
à System.Web.HttpApplication.ExecuteStep (étape IExecutionStep , Boolean & completedSynchronously)
La question est de savoir comment gérer correctement les relations plusieurs à plusieurs en utilisant la mise en correspondance automatique.
Remarque: le mappage fonctionnait avant la mise à jour de la pile NHibernate/FluentNHibernate ...
définitions pertinentes sont collées ci-dessous:
Les classes de domaine (DLL 1):
public class User : Entity
{
// ... removed properties
public virtual IList<Role> Roles { get; protected set; }//has many
// ... removed methods
}
public class Role : Entity
{
// ... removed properties
public virtual IList<User> Users { get; protected set; }//has many
// ... removed methods
}
classe d'entité (DLL 2):
/// <summary>
/// Base Entity deffinition
/// </summary>
public abstract class Entity : IEquatable<Entity>
{
private int _Id = 0;
public virtual int Id { get { return _Id; } }
//... removed methods
}
Conventions:
public class PrimaryKeyConvention : IIdConvention
{
public void Apply(IIdentityInstance instance)
{
instance.Column(instance.EntityType.Name + "Id");
instance.GeneratedBy.HiLo("100");
instance.Access.ReadOnlyPropertyThroughPascalCaseField(PascalCasePrefix.Underscore);
}
}
public class ClassConvention : IClassConvention
{
public void Apply(IClassInstance instance)
{
instance.Table(Inflector.Pluralize(instance.EntityType.Name));
instance.LazyLoad();
instance.Cache.NonStrictReadWrite();
}
}
Many to many Convention:
public class ManyToManyConvention : IHasManyToManyConvention
{
public void Apply(IManyToManyCollectionInstance instance)
{
if (instance.OtherSide == null)
{
instance.Table(
string.Format(
"{0}To{1}",
Inflector.Pluralize(instance.EntityType.Name),
Inflector.Pluralize(instance.ChildType.Name)));
instance.Cascade.AllDeleteOrphan();
}
else
{
instance.Inverse();
}
}
}
Modèle:
var persistanceModel = AutoMap.AssemblyOf<DataModelPaceholder>()
.AddEntityAssembly(typeof(Entity).Assembly)
.Conventions.AddFromAssemblyOf<ClassConvention>()
.UseOverridesFromAssemblyOf<DataModelPaceholder>()
.Setup(s =>
{
s.SubclassStrategy = t => SubclassStrategy.JoinedSubclass;
s.IsComponentType = type => type == typeof(MoneyComponent);
})
.IgnoreBase<Entity>()
.IgnoreBase<EntityAudit>()
//.IncludeBase<Product>()
.Where
(
type => typeof(Entity).IsAssignableFrom(type) && !type.IsAbstract
);
J'ai la structure de données avec Ids et tableaux comme décrit ici: http://picasaweb.google.com/lh/photo/eqlcpbYfEc2R0doCjsEdDg?authkey=Gv1sRgCMas5N_E08Dx6wE&feat=directlink – csizo
Il semble que j'ai eu quelques problèmes de version avec le fluent- nhibernate component ... Il était en train de ramasser la version 2.1. :( – csizo
donc, c'était un problème de convention d'identification? –