Не могу понять, какой должна быть другая сторона свойства «многие ко многим» «Пользователи» - PullRequest
0 голосов
/ 11 февраля 2010

Автоматическое сопоставление моего домена работало, но теперь, когда я обновлял свой стек NHibernate, я получаю исключение сопоставления, когда Session Factory создает конфигурацию:

"Не могу понять, с какой стороны свойства «многие ко многим» «Пользователи» должно быть. "

Исключение выдается на карте "многие ко многим"

Трассировка всего стека такая:

в FluentNHibernate.Cfg.FluentConfiguration.BuildConfiguration () в
C: \ hornget.horn \ ORM \ fluentnhibernate \ Working-2,1 \ SRC \ FluentNHibernate \ Cfg \ FluentConfiguration.cs: линия 119 на
WebApplication1.NHibernateManager.SessionFactoryManager.BuildConfiguration (AutoPersistenceModel
persistanceModel) в
C: \ WebProgramming \ Projects \ WebApplication1 \ WebApplication1 \ NHibernateManager \ SessionFactoryManager.cs: линия 116 в
WebApplication1.NHibernateManager.SessionFactoryManager.GetSessionFactory () в
C: \ WebProgramming \ Projects \ WebApplication1 \ WebApplication1 \ NHibernateManager \ SessionFactoryManager.cs: линия 71 at
WebApplication1.NHibernateManager.SessionManager.CloseSession () в
C: \ WebProgramming \ Projects \ WebApplication1 \ WebApplication1 \ NHibernateManager \ SessionManager.cs: линия 47 на
WebApplication1.Global.Application_EndRequest (Отправитель объекта, EventArgs e) в
C: \ WebProgramming \ Projects \ WebApplication1 \ WebApplication1 \ Global.asax.cs: линия
36 на
System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute ()
на
System.Web.HttpApplication.ExecuteStep (IExecutionStep шаг, логическое и завершено синхронно)

Вопрос в том, как правильно обрабатывать отношения «многие ко многим», используя автоматическое отображение.
Примечание: отображение работало до того, как я обновил стек NHibernate / FluentNHibernate ...

Соответствующие определения вставлены ниже:

Классы домена (в 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  
}

Класс сущности (в 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  
}

Условные обозначения:

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

Конвенция "многие ко многим":

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

}

Модель:

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

1 Ответ

0 голосов
/ 11 февраля 2010

Есть ли у вас соединительная таблица с именем UsersToRoles с соответствующим образом названными столбцами в соответствии с соглашениями AutoMap по умолчанию? например User_id, Role_id?

...