У меня есть интерфейс (IContactable), который реализуется 3 классами: Person, Department, RestUnit
public interface IContactable
{
Contact Contact { get; set; }
string Title { get; }
int? Id { get; set; }
}
public class Person:IContactable
public class Department:IContactable
public class RestUnit:IContactable
Есть еще один класс, Contact, который должен поддерживать, какой из этих объектов является владельцемобъект контакта.
Часть отображения контактов, которая выполняет эту работу:
ReferencesAny(p => p.Contactable)
.EntityTypeColumn("ContactableType")
.EntityIdentifierColumn("ContactableId")
.IdentityType<int>()
.AddMetaValue<Person>("Person")
.AddMetaValue<Department>("Department")
.AddMetaValue<RestUnit>("RestUnit");
Чтобы записи контактов в базе данных были бы похожи (типы сохраняются в виде строки):
X Y ContactableType ContactableId
... ... Person 123
... ... Person 124
... ... Department 59879
... ... RestUnit 65
... ... Person 3333
... ... Department 35564
Все работает просто отлично, но фильтрует данные.Когда я хочу получить какие-то конкретные контакты, скажем, с типом отдела, я бы написал что-то вроде:
var contacts = Repository<Contact>.Find(p=>p is Department);
Nhibernate пытается фильтровать данные на основе поля ContactableType с целочисленным значением, ноСтолбец ContactableType имеет тип nvarchar
Сгенерированный запрос NHibernate:
select .......... from contact.[Contact] where ContactableType=1
Ожидаемый запрос:
select .......... from contact.[Contact] where ContactableType='Department'
Так что NHibernate вроде использует неправильный тип.int вместо строки.
Я думаю, что NH использует индекс объекта в списке, который AddMetaValue ("Department") добавил тип отдела в ...
Я надеюсь, чтообъяснение будет достаточно ясным
Я использую NH3 ....
Есть идеи?