2010-02-11 6 views
0

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 
     ); 

Répondre

0

Avez-vous une table de jonction nommée UsersToRoles avec les colonnes nommées de manière appropriée par les conventions par défaut Automap? par exemple. User_id, Role_id?

+0

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

+0

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

+0

donc, c'était un problème de convention d'identification? –