2017-04-04 9 views
2

다음과 같은 문제가 내 NHibernate 일대 다 매핑에 있습니다. 모든 고객을 얻으려면 API 메소드를 통해 다음 오류가 발생합니다.Nhibernate "컬렉션을 초기화 할 수 없습니다"

"$id":"1","Message":"An error has occurred.","ExceptionMessage":"The 'ObjectContent`1' type failed to serialize the response body for content type 'text/html; charset=utf-8'.","ExceptionType":"System.InvalidOperationException","StackTrace":null,"InnerException":{"$id":"2","Message":"An error has occurred.","ExceptionMessage":"could not initialize a collection: [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

아래 코드를 붙여 넣었습니다. 나는 구글과 내 문제에 대한 해답을 찾고 있었지만 아무것도 제안하지 않았다. 코드의 어느 부분에서 오류가 발생하는지 이해하지 못합니다. 어쩌면 문제를 해결하기 위해 내가해야 할 일이 무엇일까요? 나는 당신의 도움에 매우 기뻐할 것입니다.

고객 모델 :

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

당신의 코멘트 JSON 링크에서 내부 예외가 Incorrect syntax near the keyword 'Order'. 테이블은 SQL 키워드 인 Order라는 물품. 탈출해야합니다. 이 경우 백 틸트를 사용하십시오. 매핑 의미 정확성

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

노트 :
bagICollection<>보다는 IList<>로 매핑해야합니다. IList<>list : 각 요소가 0에서 컬렉션 크기 -1까지 데이터베이스에 기록 된 인덱스를 가지며 어떤 구멍도없는 컬렉션을 매핑합니다. 그럴 가능성은 희박합니다.

또한 모델에 bag 대신 set을 사용해야합니다. bag은 중복을 허용합니다. 모델에서 허용하지 않으면 주문은 고객 주문 모음에 한 번만 나타날 수 있습니다. set으로 변경하는 경우 ISet<> 코드를 사용하십시오.
귀하의 오류 메시지가 잘 리기하고 문제의 원인을 확인할 수 없습니다 귀하의 질문에

노트. GenericADOException에는 InnerException이 포함되어 있지만 사용자가 제공 한 메시지에는 표시되지 않습니다.

완전한 예외 메시지를 얻고 읽을 수있는 방식으로 게시하십시오. JSON을 "꽤 인쇄하십시오"또는 예외적으로 예외가 .ToString() 출력이되도록하십시오.

+0

'bag'을'set'으로,'IList <>'를'ISet <>'으로 바꾸었지만 도움이되지 않았습니다. 전체 오류가 있습니다 : http://www.jsoneditoronline.org/?id=48b540615c2550df97c1cafdb3550502 –

+0

그리고 문제 해결에 대한 답변이 들어 있습니다. 답변이 수정되었습니다. –

+0

이제 작품입니다. 고마워요! –