【问题标题】:Can't figure out what the other side of the many-to-many property 'Users' should be无法弄清楚多对多属性“用户”的另一面应该是什么
【发布时间】:2010-02-11 23:10:41
【问题描述】:

我的域自动映射工作正常,但现在当我更新我的 NHibernate 堆栈时,我在会话工厂构建配置时遇到映射异常:

“想不通对方是什么 多对多属性“用户” 应该是。”

在多对多映射上抛出异常

整个堆栈跟踪是这个:

在 FluentNHibernate.Cfg.FluentConfiguration.BuildConfiguration() 在
c:\hornget.horn\orm\fluentnhibernate\Working-2.1\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 119 在
WebApplication1.NHibernateManager.SessionFactoryManager.BuildConfiguration(AutoPersistenceModel
持久模型)在
C:\WebProgramming\Projects\WebApplication1\WebApplication1\NHibernateManager\SessionFactoryManager.cs:line 116 在
WebApplication1.NHibernateManager.SessionFactoryManager.GetSessionFactory() 在
C:\WebProgramming\Projects\WebApplication1\WebApplication1\NHibernateManager\SessionFactoryManager.cs:line 71 在
WebApplication1.NHibernateManager.SessionManager.CloseSession() 在
C:\WebProgramming\Projects\WebApplication1\WebApplication1\NHibernateManager\SessionManager.cs:line 47 在
WebApplication1.Global.Application_EndRequest(Object sender, EventArgs e) in
C:\WebProgramming\Projects\WebApplication1\WebApplication1\Global.asax.cs:line
36 在
System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()

System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean & completedSynchronously)

问题是如何使用自动映射正确处理多对多关系。
注意:映射在我更新 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
        );

【问题讨论】:

    标签: nhibernate fluent-nhibernate automapping


    【解决方案1】:

    您是否有一个名为 UsersToRoles 的联结表,其中包含根据 AutoMap 默认约定适当命名的列?例如User_id,Role_id ?

    【讨论】:

    • 我有 Ids 和 Tables 的数据结构,如下所述:picasaweb.google.com/lh/photo/…
    • 似乎我在使用 fluent-nhibernate 组件时遇到了一些版本问题……它正在使用 2.1 版。 :(
    • 所以,这是一个 id 约定问题?
    • 这是一个 Id 约定问题,但由于 fluentnhibernate 版本控制。我使用 hornget 更新了 fluentnhibernate 并且构建存在一些问题......它生成的版本没有正确处理多对多约定。我的结论是仔细检查大黄蜂的输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多