Nhibernate“无法初始化集合”

3
我在使用NHibernate One-to-many mappings时遇到了问题。如果我想通过API方法获取所有Customers,我会收到以下错误信息:
"$id":"1","Message":"发生错误。", "ExceptionMessage": "ObjectContent`1类型无法序列化内容类型为'text / html; charset = utf-8'的响应正文。", "ExceptionType": "System.InvalidOperationException", "StackTrace":null,"InnerException":{"$id":"2","Message":"出现错误。", "ExceptionMessage":"无法初始化集合:[Designet.Models.Customer.Orders#1] [SQL:SELECT orders0_.CustomerId as Custom2_2_1_, orders0_.Id as Id1_2_1_, orders0_.Id as Id1_2_0_, orders0_.CustomerId as Custom2_2_0_, orders0_.Description as Descri3_2_0_, orders0_.Price as Price4_2_0_, orders0_.Created as Create5_2_0_, orders0_.Deadline as Deadli6_2_0_ FROM Order orders0_ WHERE orders0_.CustomerId =?]", "ExceptionType":"NHibernate.Exceptions.GenericADOException","StackTrace":"w NHibernate.Loader.Loader.LoadCollection(ISessionImplementor session,Object id,IType type)\r\n"}}
下面是我的代码。我在Google和SO上寻找解决方案,但是没有人提出的任何建议有所帮助。我不明白哪一部分代码引发了错误。也许您有一些建议,可以解决这个问题?非常感谢您的帮助。
客户模型:
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个回答

1
您的评论json链接中的内部异常写入了“Incorrect syntax near the keyword 'Order'。”您的表名为“Order”,这是一个SQL关键字。它必须被转义。使用反引号进行转义。
<class name="Order" table="`Order`" ...

关于语义正确性映射的注释:
一个bag应该被映射为一个ICollection<>而不是一个IList<>。一个IList<>用于映射一个list:一个集合,在其中每个元素在数据库中都有一个从零到集合大小减一的索引记录,没有任何空缺。这是非常不可能的。

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

关于您的问题的注释
您的错误消息被截断,无法检查您的问题的原因。 GenericADOException应该包含另一个InnerException,但您提供的消息没有显示它。

请获取完整的异常信息,并尝试以易读的方式发布它:美化打印您的JSON,或更好的方法是获取异常.ToString()输出。

我已将“bag”更改为“set”,并将“IList <>”更改为“ISet <>”,但仍未解决问题。这里有一个完整的错误信息:http://www.jsoneditoronline.org/?id=48b540615c2550df97c1cafdb3550502 - Alojzy Mucha
它包含了你的问题的答案。答案已经编辑过了。 - Frédéric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接