【问题标题】:NHibernate: Composite key many-to-one mapping: Can't resolve property (foreign key component)NHibernate:复合键多对一映射:无法解析属性(外键组件)
【发布时间】:2011-04-23 09:23:54
【问题描述】:

我希望任何人都可以提供帮助。我必须针对这个第三方数据库进行开发,我有点被他们蹩脚的设计所困扰。不过,我想使用 NHibernate,所以我将不得不跳过箍。

简单地说,这个“事件”表与“运输”表有关系。运输表有一个由字段“ID”和“FK_EventID”组成的复合主键,后者当然指的是Event-record。每个事件都指向运输表中的一个不同的记录,因此它实际上是一对一的关系。这两个字段都是Guids BTW。

尝试将其映射出来,这就是我创建类的方式(为简单起见,省略了其他数据字段):

   public class FcoEvent : IFcoObject
   {
       public virtual Guid ID { get; set; }

       //public virtual Guid FK_TransportationID { get; set; } //ignore
       public virtual FcoTransportation Transportation { get; set; } 

还有:

[Serializable]
public class FcoTransportation : IFcoObject
{
    #region Members

    public virtual Guid ID { get; set; }

    public virtual Guid FK_EventID { get; set; }

在映射文件中我正在尝试这个(注意我使用的是多对一):

   <class name="FcoLib.FcoEvent, FcoLib" table="FCO_Event">
     <id name="ID" column="ID">
      <generator class="guid" />
     </id>
     <many-to-one name="Transportation" not-found="ignore" cascade="save-update"
                 class="FcoLib.FcoTransportation, FcoLib">
     <column name="FK_TransportationID" />
     <column name="ID" />
    </many-to-one> 

还有:

   <class name="FcoLib.FcoTransportation, FcoLib" table="FCO_Transportation">
     <composite-id>
       <key-property name="ID" />
       <key-property name="FK_EventID" />
     </composite-id>

当我尝试运行它时,我收到以下异常消息:

NHibernate.QueryException:无法解析属性:FK_TransportationID of:FcoLib.FcoEvent

我的第一个预感是字段名称可能存在拼写错误,但事实并非如此。所以现在我完全感到困惑,不知道如何进行。任何帮助是极大的赞赏。谢谢。


更新

我想我找到了错误的根源。我还没有看过那里,因为我认为这是一个映射错误,但显然它是一个查询错误。它发生在我进行查询的地方:

fcoEvents = session.CreateCriteria(typeof(FcoEvent))
                    .Add(Restrictions.Eq("ID", eventId))
                    .Add(Restrictions.Eq("FK_TransportationID", transportId))
                    .List<FcoEvent>();

我会进一步研究这个,但显然我需要以不同的方式查询这个......

【问题讨论】:

    标签: nhibernate mapping composite-key one-to-one many-to-one


    【解决方案1】:

    我傻了。我被一些错误的、过时的代码分散了注意力。关键是能够使用事件的主键检索包括相关传输子项在内的事件,并且这很简单。此外,应该可以使用复合主键检索传输问题,这可以通过以下代码完成。

        public FcoTransportation GetTransportation(Guid transportId, Guid eventId)
        {
            FcoTransportation transport;
    
            ISession session = Factory.OpenSession();
            ITransaction tx = session.BeginTransaction();
            try
            {
                transport = session.Get<FcoTransportation>(new FcoTransportation()
                   {
                       ID = transportId,
                       FK_EventID = eventId
                   });
    

    所以这真的不是问题。我刚刚被整个复合外键的东西弄糊涂了。我希望我没有浪费人们的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-31
      • 2011-08-08
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      相关资源
      最近更新 更多