NHibernate(Fluent映射)ReferencesAny <object> </object>

时间:2013-11-13 11:28:15

标签: nhibernate fluent-nhibernate

基本实体接口是IEntity,它只需要实现“对象ID {get; set;}”。 现在,几乎在每种情况下ID都是Guid类型(会员资格除外)。 我使用以下代码来做接口

的映射
...
    AnyPart<IEntity> primaryMap = ReferencesAny(x => x.Primary)
                    .IdentityType<object>() // tried with .IdentityType<Guid>()
                    .EntityIdentifierColumn("PrimaryID")
                    .EntityTypeColumn("PrimaryType")
                    .MetaType<string>();
...

当然,接下来我要添加元值。

所以,现在得到错误

源阵列不够长。检查srcIndex和length,以及数组的下限

并使用 .IdentityType<Guid>()

无法解析属性:Primary.ID:Founder.Connection [.SingleOrDefault [Founder.Connection](NHibernate.Linq.NhQueryable`1 [Founder.Connection],Quote((x,)=&gt; (OrElse(AndAlso(Equal(x.Primary.ID,35c2142a-4c17-4b77-96fd-a2570028a211),Equal(x.Secondary.ID,35c2142a-4c17-4b77-96fd-a2570028a211)),AndAlso(Equal(x。 Secondary.ID,35c2142a-4c17-4b77-96fd-a2570028a211),Equal(x.Primary.ID,35c2142a-4c17-4b77-96fd-a2570028a211))))),)]

更新

我也试过了.IdentityType(x=>x.ID)但同样的问题(源数组不够长)

更新II

发生此错误的查询(实际上包含查询的整个方法)如下:

public IQueryable<Connection> GetConnections(IEntity connectable)
        {
            IQueryable<Connection> query =
                Query().Where(
                    x => x.Primary.ID == connectable.ID || x.Secondary.ID == connectable.ID);
            return query;
        }

1 个答案:

答案 0 :(得分:1)

在查询中尝试此操作:x.Primary == connectable(不含ID)。

问题是您引用了object(或其他未映射的类型,这就是您需要any映射的原因)。 ID上没有object

顺便说一句,使用HQL将允许您使用关键字id来访问id,这在Linq中不可用(技术上它可以作为扩展方法使用,但我不知道Linq到NH很好,可以说它是否已经实施)。每个any引用在概念上都有idclass