使用属性覆盖FluentNhibernate AutoMapper的许多许多

本文关键字:许多许 AutoMapper FluentNhibernate 属性 覆盖 | 更新日期: 2023-09-27 17:49:30

我想使用NHibernate Automapper来映射以下类:

public class AdminUser: Identity, IIdentityWithRoles 
{
   public virtual IList<Role> Roles { get; set; }         
}

问题是Automapper在模式中创建了一个多对一的关系,其中角色上有adminuserId。但是我需要角色是很多很多的。我不能更改Role类,使其具有IList,因为它在一个单独的库中,并且不知道AdminUser。

我真正想做的是能够添加这样一个属性:

public class AdminUser: Identity, IIdentityWithRoles 
{
   [ManyToMany]
   public virtual IList<Role> Roles { get; set; }         
}

将强制automapper执行此操作。是否可以调整我的Automapper配置来查找此属性,或者是否有一些内置到FluentNhibernate中已经完成了这项工作?

非常感谢你提供的任何帮助。

UPDATE——

好的,谢谢你的指针(向上投票),但现在我被困在这里:

public class ManyToManyConvention : AttributePropertyConvention<ManyToManyAttribute>
    {
        protected override void Apply(ManyToManyAttribute attribute, IPropertyInstance instance)
        {
            How can I now say that this property should be a many to may relationship
        }
    }
    public class ManyToManyAttribute : Attribute
    {
    }

使用属性覆盖FluentNhibernate AutoMapper的许多许多

您必须为默认的AdminUser映射编写重写:

public class AdminUserOverride : IAutoMappingOverride<AdminUser>
{
  public void Override(AutoMapping<AdminUser> mapping)
  {
    mapping.HasManyToMany(x => x.Roles); // and possibly other options here
  }
}

并注册到您的AutoMapping:

Fluently.Configure()
  .Database(/* database config */)
  .Mappings(m =>
    m.AutoMappings
      .Add(AutoMap.AssemblyOf<AdminUser>().UseOverridesFromAssemblyOf<AdminUser>()))

如果这种情况不止发生在一个地方,您可以用Convention替换它,但这有点复杂。