Автоматическое сопоставление моего домена работало, но теперь, когда я обновлял свой стек 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
);