Можно ли использовать соглашение Fluent NHibernate для сопоставления всех ICollections как наборов?
-
22-09-2019 - |
Вопрос
Можно ли использовать соглашение Fluent NHibernate для сопоставления всех ICollections как наборов?У меня есть такая сущность:
public class NoahsArk
{
public virtual ICollection<Animal> Animals { get; set; }
public NoahsArk()
{
Animals = new HashSet<Animal>();
}
}
При свободном отображении это свойство будет отображаться как HasMany(x => x.Animals).AsSet()
, но как мне это сделать с соглашением, которое я хочу использовать с автосопоставителем?
Я должен добавить, что по умолчанию, ICollections
упорствовать как ILists
, и я получаю исключение приведения, когда оно пытается привести HashSet
к IList
.
Решение
В настоящее время это невозможно в рамках конвенции.Если вы хотите, чтобы автосопоставитель по умолчанию обрабатывал ваши коллекции как наборы, используйте ISet
вместо ICollection
.
Другие советы
В ответ на вопрос Кристины, вам нужно создать новый класс, реализующий IAutoMappingOverride<T>
:
public class AlbumOverride : IAutoMappingOverride<Album>
{
public void Override(AutoMapping<Album> mapping)
{
mapping.HasMany(x => x.Pictures).AsSet().Inverse();
}
}
Затем сообщите FNH использовать его в конфигурации:
Fluently.Configure()
.Database(...)
.Mappings(m => m.AutoMappings.Add(AutoMap.Assemblies(...)
.UseOverridesFromAssemblyOf<Album>()))
.BuildConfiguration();
Вам понадобится новый класс переопределения для каждой сущности, для которой вам нужно переопределение, но в основном это дело копирования и вставки.