2012-02-13 12 views
4

UserのタイプDictionaryItemStatusプロパティがあり、これはUserTypeとしてマップされています。今私は、次のLINQ文を作りたい:nhibernateのユーザータイプ列で検索

Session.Query<User>().Where(x => x.LoginStatus.Code == "").ToList(); 

私は例外次しまっ:

追加情報:プロパティを解決できませんでした:コードの:ユーザー

私はこの問題を知っています私のカスタムタイプ(プロパティコードは私のDictionaryItemユーザタイプに存在しました)を使用して検索しています。 nhibernateセッションクエリは、ToList()を呼び出したときにSQL文を生成しますが、LoginStatusは参照型ではありません。User型のみですが、ユーザ型の問合せを行うための回避策はありますか?

編集1:ソースコードの下 :

public class User 
{ 
    public virtual Guid Id { get; set; } 
    public virtual DictionaryItem LoginStatus { get; set; } 

    public User() 
    { 
    } 
} 

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.LoginStatus).CustomType<DictionaryItemCustomType>(); 
    } 
} 
public class DictionaryItem 
    { 
     public virtual int Id { get; set; } 
     public virtual string Code { get; set; } 
     public virtual string Description { get; set; } 
    } 
public class DictionaryItemCustomType : IUserType 
    { 
     public new bool Equals(object x, object y) 
     { 
      if (x == null && y == null) 
      { 
       return true; 
      } 
      if (x == null || y == null) 
      { 
       return false; 
      } 
      return ((DictionaryItem)x).Id == ((DictionaryItem)y).Id; 
     } 

     public int GetHashCode(object x) 
     { 
      return x.GetHashCode(); 
     } 

     public object NullSafeGet(IDataReader rs, string[] names, object owner) 
     { 
      object value = NHibernateUtil.Int32.NullSafeGet(rs, names); 
      if (value == null) 
      { 
       return null; 
      } 

      return AutofacServiceHostFactory.Container.Resolve<IDictionaryRepository>().DictionaryItems.First(x => x.Id == (int)value); 
     } 

     public void NullSafeSet(IDbCommand cmd, object value, int index) 
     { 
      DictionaryItem dictionaryItem = value as DictionaryItem; 
      NHibernateUtil.Int32.NullSafeSet(cmd, dictionaryItem == null ? (object)null : dictionaryItem.Id, index); 
     } 

     public object DeepCopy(object value) 
     { 
      return value; 
     } 

     public object Replace(object original, object target, object owner) 
     { 
      return DeepCopy(original); 
     } 

     public object Assemble(object cached, object owner) 
     { 
      throw new NotImplementedException(); 
     } 

     public object Disassemble(object value) 
     { 
      throw new NotImplementedException(); 
     } 

     public SqlType[] SqlTypes 
     { 
      get { return new[] { NHibernateUtil.Int32.SqlType }; } 
     } 

     public Type ReturnedType 
     { 
      get { return typeof(DictionaryItem); } 
     } 

     public bool IsMutable 
     { 
      get { return false; } 
     } 
    } 

Bdのルックのような:

CREATE TABLE [dbo].[User](
    [Id] [uniqueidentifier] NOT NULL, 
    [LoginStatusId] [int] NOT NULL 
) 

CREATE TABLE [dbo].[DictionaryItem](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Code] [nvarchar](20) NOT NULL, 
    [Description] [nvarchar](200) NOT NULL, 
) 
+0

エンティティのプロパティ、リレーションシップ、またはテーブル構造を転記してください。 –

+0

私はソースコード –

答えて

1

はこれを試してみてください:

DictionaryItem statusAlias = null; 
User userAlias = null; 
return Session.QueryOver<User>(() => userAlias) 
    .JoinAlias(() => userAlias.LoginStatus,() => statusAlias) 
    .Where(() => statusAlias.Code == "") 
    .ToList(); 
+0

を追加しました。LoginStatus statusAlias = null; DictionaryItemのstatusAlias = nullである必要があります。あなたの質問は私のために非常に素晴らしいと思われます、あなたは説明できますか?私は以下の例外を持っています: "Not association:LoginStatus" –

+0

@Adam、 '.hbm'ファイルで定義された2つのエンティティ間のマッピングをチェックし、解決のために' DictionayItem'エンティティの別名を付ける必要がありますそのプロパティを使用し、それらを使用するには、このページの関連セクションを参照してください:http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx。 –

+0

まず、リンクをありがとうございます。あなたのクエリは、私がLoginStatusプロパティのためのそのようなマッピングを持っているとき、完璧に動作します:References(x => x.LoginStatus);しかし、私はマップ(x => x.LoginStatus).CustomType (); assosactionには例外があります: "not association:LoginStatus"。私は、LoginStatusがInt値としてマップされているので、nhiberanteの正しい振る舞いになると思う。辞書項目テーブルとの関係に関する情報はない。私とは違って考えると、サンプルプロジェクトを作成して送ることができます。なぜなら、私にとっては非常に不思議なケースなのでです。 –

0

あなたのマッピングが正しくありません。 DictionaryItemはカスタムタイプとしてマッピングされるべきではありません。私にとっては別の存在のようです。

Map(x => x.LoginStatus).CustomType<DictionaryItemCustomType>(); 

上記は、単一の列のみをマップすることを示しています。実際のエンティティDictionaryItemをUserにマップしたいとします。あなたはこのような何かを実行する必要があります。

References(x => x.LoginStatus, "LoginStatusId"); 

次にあなたがDictionaryItemをマップする必要があります。

public class DictionaryItemMap : ClassMap<DictionaryItem> 
{ 
    public DictionaryItemMap() 
    { 
     Id(x => x.Id); //You'll need to do something else here for identity columns 
     Map(x => x.Code); 
     Map(x => x.Description); 
    } 
} 

あなたの場所にこのマッピングを持った後、あなたはMGAによって、上記のクエリを行うことができます。

LoginStatus statusAlias = null; 
User userAlias = null; 
return Session.QueryOver<User>(() => userAlias) 
    .JoinAlias(() => userAlias.LoginStatus,() => statusAlias) 
    .Where(() => statusAlias.Code == "") 
    .ToList(); 
+0

残念ながら、私は何が欲しいかを知っています。私は、そのプロパティを呼び出すたびに撮影がdadabaseに来るので、repostioryからの私のカスタムタイプでは、私は私のカスタムタイプを削除することができます知っているwanyマッピング、DictionaryItem型のプロパティの参照マッピングを使用したくないので、参照マッピングを追加し、辞書項目データを撮影しないために第2レベルのキャッシュを使用するが、私は自分のカスタムタイプを使用したい;) –