NHibernate не фильтрует базу данных по COORECT TYPE метаданных - PullRequest
2 голосов
/ 09 марта 2011

У меня есть интерфейс (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 ....

Есть идеи?

1 Ответ

0 голосов
/ 09 октября 2012

Вы пытались добавить дополнительную строку:

ReferencesAny(p => p.Contactable)
    .MetaType<string>()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...