2017-04-04 28 views
2

NHibernate One-to-Manyマッピングに次の問題があります。私は私の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

。私はGoogleと私の問題の答えを探していたが、何も提案されていなかった。私はコードのどの部分がエラーを投げるのか分かりません。問題を解決するために、私は何をすべきでしょうか?私はあなたの助けを非常にうれしく思います。

カスタマーモデル:

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

SQLキーワードであるあなたのテーブルがOrder命名されIncorrect syntax near the keyword 'Order'.コメントのJSONリンク書き込み、から内部例外。それはエスケープする必要があります。このためにバックチルトを使用してください。意味論的正しさをマッピングするため

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


bagICollection<>なくIList<>としてマッピングされなければなりません。 IList<>は、listをマッピングするためのもので、各要素がデータベースに記録されたインデックスを持ち、ゼロからコレクションサイズマイナス1までのコレクションです。あなたが望むことはほとんどありません。

また、ご使用のモデルでは、の代わりにsetを使用する必要があります。bagは複製を許可します。お客様のモデルでは許可されていないため、注文は顧客注文コレクションに1回しか表示されません。 setに変更する場合は、コードにISet<>を使用してください。
あなたのエラーメッセージが切り捨てられ、あなたの悩みの原因であるかどうか確認することはできませんあなたの質問に

ノート。 GenericADOExceptionには別のInnerExceptionが含まれていますが、指定したメッセージには表示されません。

完全な例外メッセージを取得して、読みやすい方法で投稿してください:JSONを "きれいに印刷"するか、例外として.ToString()例外を取得することをお勧めします。

+0

私は 'bag'を' set'に、 'IList <>'を 'ISet <>'に変更しましたが、助けになりませんでした。完全なエラーがあります:http://www.jsoneditoronline.org/?id=48b540615c2550df97c1cafdb3550502 –

+0

そしてあなたのトラブルに対する答えが含まれています。回答が編集されました。 –

+0

そして今はそれが仕事です。どうもありがとうございました! –

関連する問題