【问题标题】:Getting error "Association references unmapped class" when using interfaces in model在模型中使用接口时出现错误“关联引用未映射的类”
【发布时间】:2010-03-12 14:11:01
【问题描述】:

我正在尝试使用流利的自动映射功能来生成一个 以下模型和程序的 DDL,但不知何故我不断得到 我打电话时出现错误“关联引用未映射的类:IRole” NHibernate 中的 GenerateSchemaCreationScript 方法。当我更换 具有接口实现的 IList 的类型(用户 和角色)一切正常。我在这里做错了什么?我怎样才能 流畅地使用定义的 IUser 和 IRole 的实现版本 在 Unity 中?

public interface IRole
{
   string Title { get; set; }
   IList<IUser> Users { get; set; }
}

   public interface IUser
   {
       string Email { get; set; }
       IList<IRole> Roles { get; set; }
   }

public class Role : IRole
{
   public virtual string Title { get; set; }
   public virtual IList<IUser> Users { get; set; }
}
public class User : IUser
{
   public virtual string Email { get; set; }
   public virtual IList<IRole> Roles { get; set; }
}

我使用以下程序使用以下程序生成 DDL NHibernate 中的 GenerateSchemaCreationScript:

class Program
{
   static void Main(string[] args)
   {
       var ddl = new NHibernateSessionManager();
       ddl.BuildConfiguration();
   }
}

   public class NHibernateSessionManager
   {
       private ISessionFactory _sessionFactory;
       private static IUnityContainer _container;

       private static void InitContainer()
       {
           _container = new UnityContainer();
           _container.RegisterType(typeof(IUser), typeof(User));
           _container.RegisterType(typeof(IRole), typeof(Role));
       }

       public ISessionFactory BuildConfiguration()
       {
           InitContainer();
           return
Fluently.Configure().Database(MsSqlConfiguration.MsSql2008
                .ConnectionString("ConnectionString"))
                .Mappings(m => m.AutoMappings.Add(
                    AutoMap.AssemblyOf<IUser>()))
                .ExposeConfiguration(BuildSchema)
                .BuildSessionFactory();
       }

       private void BuildSchema(Configuration cfg)
       {
           var ddl = cfg.GenerateSchemaCreationScript(new
NHibernate.Dialect.MsSql2008Dialect());
           System.IO.File.WriteAllLines("Filename", ddl);
       }

   }

【问题讨论】:

    标签: nhibernate unity-container fluent automapping


    【解决方案1】:

    我的情况和你一样。在我知道您可以使用 Fluent 之前使用过 ClassMap,但我之前从未使用过 AutoMapping 功能。我已经成功地使用 IReferenceConvention 与 AutoMapper 进行了一对一的映射(参见之前的 SO post)。

    我现在遇到了和你一样的问题,我有一个一对多的映射,我现在遇到了问题。有一个 IHasManyConvention 接口,我已经开始查看,但目前还没有运气。

    仅仅因为有些事情很难做到,它并不会出错,映射到接口无疑是有价值的,并且可以在原始 nHibernate 映射文件或使用 Fluents ClassMap 映射文件中轻松完成。我认为一旦人们开始更多地使用 AutoMapping 功能,就会有更多的博客文章。

    编辑

    我找到了一个使用IAutoMappingOverride 的临时解决方案。以下是您需要的粗略示例。

    public class RoleAutoMappingOverride : IAutoMappingOverride<Role>
    {
        public void Override(AutoMapping<Role> mapping)
        {
            mapping.HasMany<User>( x => x.Users ).KeyColumn( "User_id" );
        }
    }
    

    编辑

    我的一所大学制定了一个更好的解决方案,它使用约定而不是覆盖。这涵盖了如何做一个单一的课程,但是如果您查看我之前提到的 SO 帖子,您会看到如何将其设为通用。

    public class Foo : IHasManyConvention
    {
        public void Apply(IOneToManyCollectionInstance instance)
        {
            if (instance.ChildType == typeof(Role))
            {
                instance.Relationship.CustomClass<User>();
            }
        }
    }
    

    编辑

    我现在已经把这篇文章和我的另一篇文章变成了一篇博文: http://bronumski.blogspot.com/2011/01/making-fluent-nhibernate-automapper.html

    【讨论】:

      【解决方案2】:

      AssemblyOf&lt;T&gt; 中的类型 T 不能提供接口,需要提供具体类型。或者您可以使用接受组件的方法:

      .Mappings(m => m.AutoMappings.Add(
                      AutoMap.Assembly(myAssembly)))
      

      编辑:问题在于您的类包含接口类型而不是类类型的集合。我不知道是否可以以这种方式自动映射接口。另外,我认为使用接口来指定域对象几乎没有任何价值。

      【讨论】:

      • 对此感到抱歉 - 它当然应该是: .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf())) 但我的问题还是一样,我明白了错误:public virtual IList Users { get;放; } 和 public virtual IList Roles { get;放;任何想法如何解决这个问题?
      • 根据steve-fair-dev.blogspot.com/2009/10/… 可以告诉NHibernate 它应该为接口使用哪个实现(使用映射文件)。我只是想知道是否有办法让 Fluent 中的自动映射知道同样的事情?
      • @Bjarke - 您可以这样做,请参阅我的回答和引用的 SO 帖子。
      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 2017-05-12
      • 2011-03-07
      • 2023-02-01
      相关资源
      最近更新 更多