2011-03-09 16 views
2

我有一個接口(IContactable),由3類實現的COORECT類型來過濾數據的基礎上:個人,部門,RestUnit的NHibernate不會對元數據

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 

還有另一個類,聯繫,這應該維護這些對象中的哪一個是聯繫實體的所有者。
聯繫映射其做這項工作的一部分是:

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(「部」)增加了部門類型分爲...

我希望解釋就足夠
我用NH3明確...

有什麼想法嗎?

+0

非常有趣的問題。你有沒有解決這個問題? – 2012-01-16 14:49:59

+0

不幸的是,很遺憾無法找到解決辦法 – 2012-01-18 10:50:08

回答

0

你有沒有嘗試添加一個額外的行:

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