2010-12-30 6 views
2

クラスをデータベーステーブルにマップする必要があります。流暢なNHibernate 2つの同じクラスを1つのテーブルにマッピングします。最初に怠惰になり、2番目に怠惰になります。

例: 以下に説明するこれらの2つのクラスの複製を作成し、FNHを使用してそれらをマップしますが、元のレイジーローディングと重複してオフにします。

http://i.stack.imgur.com/goG30.png

基本的に、私はフェッチTeamMembersを持つすべてのリストを持っていますが、それらのメンバーはすべてのチームと他のすべて、TeamMemberに関する単なる情報を持つべきではないDBからチームを得ることができるようにしたいです。また、私はDBからTeamMemberを取得するとき、私はすべてのチームがプレーンな情報だけを含むようにしたい。

"http://i.stack.imgur.com/7OkyD.png" - >新しいユーザーは写真やリンクを投稿できません。

私はそれらの2つのクラスだけを持っている場合、遅延読み込みがいずれかの側でオンになっている場合、前に説明した状況の1つが満たされません。もし怠け者が両側にいないなら、私は必要でもなくてもいいデータをたくさん得ます。

最初はオリジナルと複製が同じ名前でパッケージが違っていましたが、マッピングがあいまいであるという例外がありました。これがうまくいく方法があれば理想的です。 これを行う方法はありますか?

回答が見つかりませんでしたので、名前の重複をNameOfOriginal + Liteに変更しました。 マッピングが解析されたが、私は、データベースからチームを取得したいとき、私は例外を取得した

{ "ORA-00904:\" "\ "":無効な識別子\ nを" SUPERVIZ _ \ TEAMMEMBERLITE_ID \}

したがって、明らかにFNHはクラス名と広告に "_ID"を読み取り、それを自分の重複クラスのIDとして使用しているため、問題が発生します。 .ParentKeyColumn( "") .ChildKeyColumn( "") で試しましたが、成功しませんでした。

私は、私はあまりあなたを混同しませんでした:)

[DataContract] 
    public class Team 
    { 
      [DataMember] 
      public virtual int Team_id { get; private set; } 

      [DataMember] 
      public virtual String Name { get; set; } 

      [DataMember] 
      public virtual String Description { get; set; } 

      [DataMember] 
      public virtual TeamMember Deputy { get; set; } 

      [DataMember] 
      public virtual TeamMember Leader { get; set; } 

      [DataMember] 
      public virtual IList<TeamMember> TeamMembers { get; set; } 

      [DataMember] 
      public virtual IList<TeamMember> Supervizors { get; set; } 
    ... 
    } 


    [DataContract] 
    public class TeamMember 
    { 
      [DataMember] 
      public virtual int TeamMember_id { get; set; } 

      [DataMember] 
      public virtual String First_name { get; set; } 

      [DataMember] 
      public virtual String Last_name { get; set; } 

      [DataMember] 
      public virtual String Sid { get; set; } 

      [DataMember] 
      public virtual IList<Team> SupevisingTeams { get; set; } 

      [DataMember] 
      public virtual IList<Team> LeaderInTeams { get; set; } 

      [DataMember] 
      public virtual IList<Team> DeputyInTeams { get; set; } 

      [DataMember] 
      public virtual IList<Team> MemberInTeams { get; set; } 
    ... 
    } 
+0

は怠惰有効/無効にする方が簡単に問い合わせることないです流暢NHibernateはを使用して

マッピングよりも読み込み中ですか? – Paco

+0

lazy = falseが実際に必要な場合は見たことがありません。欠陥のあるソリューションのハックを要求するのではなく、実際の問題について教えてください。 (私は厳しく聞こえるわけではありません、それはちょうど私が知っている*これは悪いアプローチです) –

+0

事は、ポストに示されたクラスは私のデータベースモデルの一部です。私はすでにすべてのマッピングで怠惰な負荷を取り除いていますが、1つだけのエンティティを取得するのに約20秒待っています!待機はDBサイズで進行します。私は必要なものだけを取得するのではなく、代わりにオブジェクトツリー全体を取得するからです。時には私はそれをすべて必要とすることもありますが、時には私はそうではなく、データの一部しか必要としません。多分、私がしたいことはできません。おそらく助けになるものに取り組んでいます。もしそうなら、私はコメントを残します。 – Vladica

答えて

0

あなたがマッピングにエンティティ名を与える場合は、クラスを複数回マップすることができます願っています。この自動マッピングではなく、ClassMapを使用する必要があります。

public class Foo 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class FooMap1 : ClassMap<Foo> 
{ 
    public FooMap1() 
    { 
     Table("Foo"); 
     EntityName("Foo"); 
     Id(x => x.Id); 
     Map(x => x.Name); 
    } 
} 

public class FooMap2 : ClassMap<Foo> 
{ 
    public FooMap2() 
    { 
     Table("Foo"); 
     EntityName("Bar"); 
     Id(x => x.Id); 
     Map(x => x.Name); 
    } 
} 

をあなたはNHibernateのは、正しいマッピングを使用するようにするクエリを構築する場合、エンティティ名を指定する必要があります:

using (var session = _sessionFactory.GetCurrentSession()) 
{ 
    return session.CreateCriteria("Bar") 
     .Add(Restrictions.Eq("Name", "Andrew")) 
     .List<Foo>(); 
} 
関連する問題