繁体   English   中英

Nhibernate:无法映射一对多关系

[英]Nhibernate: Trouble mapping a one-to-many relationship

我非常熟悉nhibernate,可以肯定这里有很多显而易见的事情,但是我已经寻找答案了几天,而根本找不到适合的解决方案我的具体问题。 非常感谢您的帮助。

我将先描述我的问题,然后发布代码:

在我的对象模型中,我有一个“事件”,其IList为“组织者”。 我想使用nhibernate,以便当我执行“ session.Save(anEvent)”时,数据被写入数据库中的三个表中:Events,Organizers和Organizers_Events(联接表)。 当我使用下面的代码时,出现以下错误:

Invalid column name 'EventID'

我的代码:首先,.hbm文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="BLL"
                   namespace="BusinessLogic">

  <class name="Event" table="Events">
    <id name="EventID">
      <column name="ID"/>
      <generator class="native" />
    </id>
    <property name="Name">
      <column name="Name"/>
    </property>
    <bag name="Organizers" table="Organizers_Events" inverse="false" cascade="all-delete-orphan" lazy="true" access="nosetter.camelcase-underscore" >
      <key column="EventID"/>
      <one-to-many class="Organizer" />
    </bag>
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="BLL"
                   namespace="BusinessLogic">

  <class name="Organizer" table="Organizers">
    <id name="Id">
      <column name="ID"/>
      <generator class="native" />
    </id>
    <property name="FullName">
      <column name="FullName"/>
    </property>
    <many-to-one name="TheEvent" column="EventID" />
  </class>
</hibernate-mapping>

接下来,对象:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for Event
/// </summary>
/// 

namespace BusinessLogic
{
    public class Event
    {
        private int eventID;

        public virtual int EventID
        {
            get { return eventID; }
            set { eventID = value; }
        }
        private IList<Organizer> _organizers = null;

        public virtual IList<Organizer> Organizers
        {
            get { return _organizers; }
            set { _organizers = value; }
        }
        public Event()
        {
            //
            // TODO: Add constructor logic here
            //
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BusinessLogic
{
    public class Organizer:Invitee
    {
        private Event theEvent = new Event();

        public virtual Event TheEvent
        {
            get { return theEvent; }
            set { theEvent = value; }
        }
    }
}

最后,数据库架构:

CREATE TABLE [dbo].[Events](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](max) NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Organizers](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [FullName] [nvarchar](550) NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Organizers_Events](
    [OrganizerID] [int] NOT NULL,
    [EventID] [int] NOT NULL
) ON [PRIMARY]

我已删除了无关的数据以简化问题。 我认为其他任何内容都不会影响我的问题。 对于我们这里的目的,我只希望Event对象将其EventID和Name写入Events表,IList中的每个Organizer对象将其ID和FullName写入Organizers表,并将EventID和Organizer的ID写入其中。 Organizers_Events表。

我究竟做错了什么? 如果很多,请告诉我。 或者,如果网上已经有一个我错过的答案,请引导我前往。

在一对多关联中,您不需要联接表。 连接表仅在多对多关联中是必需的。 正确的映射

<bag name="Organizers" inverse="false" cascade="all-delete-orphan" lazy="true" access="nosetter.camelcase-underscore" >
    <key column="EventID"/>
    <one-to-many class="Organizer" />
</bag>

一对多关联的正确数据库架构

CREATE TABLE [dbo].[Events]
(
  [ID] [int] IDENTITY(1,1) NOT NULL,
  [Name] [nvarchar](max) NOT NULL
)
 ON [PRIMARY] 

CREATE TABLE [dbo].[Organizers]
( 
 [ID] [int] IDENTITY(1,1) NOT NULL, 
 [FullName] [nvarchar](550) NULL,
 [EventID] [int] NOT NULL // add FK constraint here
) 
ON [PRIMARY]   

我认为您忘了在包声明中放入inverse =“ false”了:

<bag name="Organizers" inverse="false" table="Organizers_Events" cascade="all-delete-orphan" lazy="true" access="nosetter.camelcase-underscore" >

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM