1

奇妙な問題があります。IList を持つエンティティをクエリすると、エンティティは空のままです。Languageエンティティ自体のクエリは可能です...これは私の複合キーと関係がありますか?

NHProf は、両方のエンティティが sql によってクエリされていることを示していますが、何らかの理由で結果がリンクされていません:-/

ここにいくつかのコードがあります:

public class Employee : User
{
    public virtual string firstname { get; set; }
    public virtual string lastname { get; set; }
    public virtual string uid { get; set; }
    public virtual string identity_provider
    public virtual IList<Language> languages { get; set; }
}

対応するマッピング:

public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Table("employee");
        Not.LazyLoad();
        CompositeId()
            .KeyProperty(x => x.uid)
            .KeyProperty(x => x.identity_provider);
        Map(x => x.firstname);
        Map(x => x.lastname);

        HasMany<Language>(x => x.languages)
            .Table("employee_spoken_language")
            .KeyColumns.Add("employee_uid","employee_identity_provider")
            .Inverse().Cascade.All();
    }
}

そして完全を期すために、これは「言語」がどのようにマッピングされるかです:

public class LanguageMap : ClassMap<SpokenLanguage>
{
    public LanguageMap()
    {
        Table("employee_spoken_language");
        Not.LazyLoad();
        CompositeId()
            .KeyProperty(x => x.employee_uid)
            .KeyProperty(x => x.employee_identity_provider)
            .KeyProperty(x => x.name);
        References(x => x.knowledge_level).Column("knowledge_level");
    }
}

何を変更しても、従業員エンティティは常に表示されますlanguage = {}!? これは本当に私を夢中にさせており、エラーを見つけることができません。言語を照会するためのSQLが実行されることを確認しました! データがデータベースにあることを確認しました。また、流暢を使用しているため、作成された hmb も確認しました。

<bag cascade="all" inverse="true" name="languages" table="employee_spoken_language">
  <key>
    <column name="employee_uid" />
    <column name="employee_identity_provider" />
  </key>
  <one-to-many class="Jobportal.Language, wcf, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>

うまくいけば、誰かがこれに光をもたらすことができます...前もって感謝します!

よろしく、マーティン

4

1 に答える 1

0

これは興味深いものです。私はすべてのプロジェクトで nHibernate を使用していますが、複合キーはほとんど使用していません。以前はすべてのマッピングを手動で行っていました (学習のため) が、現在はエンティティ開発ツールを使用してマッピングを生成しています。あなたのデータベースと同じ構造を持つ同等の Employee テーブルと Language テーブルをデータベースに作成し、それらに対して Entity Developer を実行して、流暢なマッピングを生成しました。これらを以下にリストしました。大きな違いは見られませんが、nHibernate がいかにうるさいかを知ることは、試してみる価値があるかもしれません。プロパティの長さが間違っている場合もありますが、特定のニーズに合わせて必要に応じて調整してください。

従業員の場合:

public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
          Schema(@"dbo");
          Table(@"Employees");
          LazyLoad();
          CompositeId()
            .KeyProperty(x => x.Uid, set => {
                set.Type("String");
                set.ColumnName("uid");
                set.Length(50);
                set.Access.Property(); } )
            .KeyProperty(x => x.IdentityProvider, set => {
                set.Type("String");
                set.ColumnName("identity_provider");
                set.Length(50);
                set.Access.Property(); } );
          Map(x => x.Firstname)    
            .Column("firstname")
            .CustomType("String")
            .Access.Property()
            .Generated.Never()
            .CustomSqlType("varchar")
            .Not.Nullable();
          Map(x => x.Lastname)    
            .Column("lastname")
            .CustomType("String")
            .Access.Property()
            .Generated.Never()
            .CustomSqlType("varchar")
            .Not.Nullable();
          HasMany<Language>(x => x.Languages)
            .Access.Property()
            .AsSet()
            .Cascade.None()
            .LazyLoad()
            .Inverse()
            .Generic()
            .KeyColumns.Add("uid", mapping => mapping.Name("uid")
                                                                 .SqlType("varchar")
                                                                 .Not.Nullable()
                                                                 .Length(50))
            .KeyColumns.Add("identity_provider", mapping => mapping.Name("identity_provider")
                                                                 .SqlType("varchar")
                                                                 .Not.Nullable()
                                                                 .Length(50));
    }
}

言語:

public class LanguageMap : ClassMap<Language>
{
   public LanguageMap()
    {
          Schema(@"dbo");
          Table(@"Languages");
          LazyLoad();
          CompositeId()
            .KeyProperty(x => x.Uid, set => {
                set.Type("String");
                set.ColumnName("uid");
                set.Length(50);
                set.Access.Property(); } )
            .KeyProperty(x => x.IdentityProvider, set => {
                set.Type("String");
                set.ColumnName("identity_provider");
                set.Length(50);
                set.Access.Property(); } )
            .KeyProperty(x => x.Name, set => {
                set.Type("String");
                set.ColumnName("name");
                set.Length(50);
                set.Access.Property(); } );
          References(x => x.Employee)
            .Class<Employee>()
            .Access.Property()
            .Cascade.None()
            .LazyLoad()
            .Columns("uid", "identity_provider");
    }
}

これらがうまく機能するかどうかお知らせください。そうでない場合は、テスト データを生成し、マッピングを使用してこれらのテーブルに対していくつかのクエリを実行してみます。

もう 1 つ考慮すべきことは、最新バージョンの nHibernate を使用していることを確認することです。

于 2013-05-24T08:21:30.690 に答える