Nhibernate“无法初始化集合”

时间:2017-04-04 21:52:53

标签: c# asp.net nhibernate orm mapping

我的NHibernate One-to-many映射存在以下问题。如果我想通过我的API方法获得所有客户,则会收到以下错误:

  

“$ id”:“1”,“消息”:“发生了错误。”,“ExceptionMessage”:“   'ObjectContent`1'类型无法序列化响应主体   内容类型'text / html;   字符集= UTF-8' “” ExceptionType。 “:” System.InvalidOperationException “ ”堆栈跟踪“:空 ”的InnerException“:{ ”$ ID“: ”2“, ”消息“:” 一个   错误已经发生。“,”ExceptionMessage“:”无法初始化a   集合:[Designet.Models.Customer.Orders#1] [SQL:SELECT   orders0_.CustomerId为Custom2_2_1_,orders0_.Id为Id1_2_1_,   orders0_.Id为Id1_2_0_,orders0_.CustomerId为Custom2_2_0_,   orders0_.Description as Descri3_2_0_,orders0_.Price as Price4_2_0_,   orders0_.Created为Create5_2_0_,orders0_.Deadline为Deadli6_2_0_   FROM订单orders0_ WHERE   orders0_.CustomerId =] “ ”ExceptionType?“: ”NHibernate.Exceptions.GenericADOException“, ”堆栈跟踪“:”   w NHibernate.Loader.Loader.LoadCollection(ISessionImplementor session,   对象ID,IType类型)\ r \ n

下面我贴了我的代码。我一直在寻找谷歌和我的问题的答案,但没有,人们提出的建议,帮助。我不明白哪部分代码会抛出错误。也许你有一些命题,我该怎么做才能解决问题?我很乐意为你提供帮助。

客户模式:

public class Customer
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }

        public virtual IList<Order> Orders { get; set; }

        public Customer()
        {
            Orders = new List<Order>();
        }
    }

客户映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true"
                   assembly="Designet" namespace="Designet.Models">
  <class name="Customer" table="Customer" dynamic-update="true" lazy="true" >
    <cache usage="read-write"/>
    <id name="Id" column="Id" type="int">
      <generator class="native" />
    </id>
    <property name="Name" />
    <bag name="Orders" lazy="true" inverse="true" >
      <key column="CustomerId"/>
      <one-to-many class="Designet.Models.Order"/>
    </bag>    
  </class>
</hibernate-mapping>

客户数据库:

CREATE TABLE [dbo].[Customer] (
    [Id]   INT            IDENTITY (1, 1) NOT NULL,
    [Name] NVARCHAR (255) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

订单型号:

 public class Order
    {
        public virtual int Id { get; set; }
        public virtual string Description { get; set; }
        public virtual decimal Price { get; set; }
        public virtual DateTime Created { get; set; }
        public virtual DateTime Deadline { get; set; }

        public virtual int CustomerId { get; set; }
        public virtual Customer Customer { get; set; }

    }

订单映射:

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true"
                   assembly="Designet" namespace="Designet.Models"
    <class name="Order" table="Order" dynamic-update="true" lazy="true" > 
    <cache usage="read-write"/>
    <id name="Id" column="Id" type="int">
      <generator class="native" />
    </id>

    <many-to-one name="Customer" column="CustomerId"/>

    <property name="Description" />
    <property name="Price" />
    <property name="Created" />
    <property name="Deadline" />
    <property name="CustomerId" not-null="true" />

  </class>
</hibernate-mapping>

订单数据库:

CREATE TABLE [dbo].[Order] (
    [Id]          INT            IDENTITY (1, 1) NOT NULL,
    [Description] NVARCHAR (MAX) NULL,
    [Price]       SMALLMONEY     NULL,
    [Created]     DATETIME       NOT NULL,
    [Deadline]    DATETIME       NULL,
    [CustomerId]  INT            NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC),
    FOREIGN KEY ([CustomerId]) REFERENCES [dbo].[Customer] ([Id])
);

1 个答案:

答案 0 :(得分:1)

注释中的内部异常json link write Incorrect syntax near the keyword 'Order'.您的表名为Order,这是一个SQL关键字。必须逃脱。为此使用后倾。

<class name="Order" table="`Order`" ...

映射语义正确性的注释:
bag应该映射为ICollection<>而不是IList<>IList<>用于映射list:一个集合,其中每个元素都有一个记录在数据库中的索引,从零到集合大小减一,没有任何漏洞。你不太希望这样。

此外,对于您的模型,您应该使用set而不是bagbag允许重复。您的模型不允许它们,订单可能只在客户订单集合中出现一次。如果您更改set,请在代码中使用ISet<>

关于您的问题的说明
您的错误消息被截断,并且不允许检查您的问题的原因。 GenericADOException应该包含另一个InnerException,但您提供的消息不会显示它。

请获取完整的异常消息,请尝试以可读的方式发布:“相当打印”您的JSON,或者更好的是,获得异常.ToString()输出。