Использование атрибута для переопределения FluentNhibernate AutoMapper для многих пользователей - PullRequest
0 голосов
/ 06 апреля 2011

Я хотел бы использовать 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 для поиска этого атрибута или в FluentNhibernate есть что-то, что уже выполняет эту работу?

Большое спасибо за любую помощь, которую вы можете предоставить.

ОБНОВЛЕНИЕ -

ОК, спасибо за указатель (upvoted), но теперь я застрял здесь:

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
    {
    }

1 Ответ

3 голосов
/ 06 апреля 2011

Вы должны написать переопределение для отображения по умолчанию 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, но это немного сложнее .

...