我有一个接口(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而不是string 我认为NH正在使用列表中对象的索引 AddMetaValue(“Department”)已将部门类型添加到...
我希望解释清楚得多 我正在使用NH3 ......
任何想法?
答案 0 :(得分:0)
您是否尝试添加额外的一行:
ReferencesAny(p => p.Contactable)
.MetaType<string>()