开发者

NHibernate does not filter data base on COORECT TYPE of meta data

I have an interface (IContactable) which is realizing by 3 classes : 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

There is another class, Contact, which should maintain which one of these objects are the owner of the contact entity.

A part of Contact mapping which does the job is:

    ReferencesAny(p => p.Contactable)
     .EntityTypeColumn("ContactableType")
     .EntityIdentifierColumn("ContactableId")
     .IdentityType<int>()
     .AddMetaValue<Person>("Person")
     .AddMetaValue<Department>("Department")
     .AddMetaValue<RestUnit>("RestUnit");

So that Contact records in database would be like (The types are being saved as string):

X     Y       ContactableType     ContactableId
...  ...        Person              123
...  ...        Person              124 
...  ...        Department          59879   
...  ...        RestUnit              65    
...  ...        Person              3333    
...  ...        Department          35564

Everything works just fine but filtering data. When I want to get some particular Contacts, say with Department type, I would write something like :

var contacts = Repository<Contact>.Find(p=>p is Depart开发者_JAVA技巧ment);

Nhibernate tries to filter data based on ContactableType field with an integer value but the ContactableType column is nvarchar

Generated query by NHibernate :

select .......... from contact.[Contact]  where ContactableType=1

Expected query:

select .......... from contact.[Contact]  where ContactableType='Department'

So NHibernate kinda using a wrong type. int instead of string.

I think NH is using the index of the object in list which AddMetaValue("Department") has added department type into...

I hope the explanation would be clear enough

I'm using NH3....

any idea?


Have you tried to add an extra line:

ReferencesAny(p => p.Contactable)
    .MetaType<string>()
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜