6

NHibernateはエンティティ内の特定の型の複数のIListを自動マッピングできないようです。Fluent NHibernate Automappingをエンティティの同じタイプの複数のリストでどのように使用できますか?

は(流暢NHibernateはソースコードに含まれているExamples.FirstProjectサンプルコードに基づく)、次の2つのエンティティを考えます。

public class Employee 
{ 
    public virtual int Id { get; private set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
} 

public class Store 
{ 
    public virtual int Id { get; private set; } 
    public virtual IList<Employee> Staff { get; set; } 
    public virtual IList<Employee> Managers { get; set; } 
} 

これは完全に有効なオブジェクトモデルであると思われます。各ストアには、複数の職員と複数の従業員がいます。

しかし、ときに私はオートマップ、スタッフやマネージャーリストがすべて同じ外部キーで、Employeeテーブルに格納されています。

Employee Table 

Id FirstName LastName Store_id 
3 Daisy  Harrison 1 
4 Jack  Torrance 1 
5 Sue  Walkters 1 
6 Tom  Tommorow 1 
7 Dick  Diggler 1 

正味の結果は、データがデータベースから読み戻されたとき、スタッフと管理者の両方のリストがテーブルのすべての行が移入されていることです。

これは私に自動マッピングのバグのように見えますが、私はどのような形態でNHibernateのにかなり新たなんだ、と完全にそれはまだ限界だか分かりません。いずれの場合においても

はどのように私はNHibernateのは明確なように2つのリストを扱うことができますか?

可能であれば、私が提供したサンプルコード(「この正確なオーバーライドをCreateSessionFactoryの.Mappingsセクションに入れてください」など)に直接対応するAutomappingコードの断片に感謝します。

私はまだ非常によく、「空白を埋める」ことができないことを意味している、物事の古いやり方に慣れて自動マッピングでのみ多少馴染み、そしてまったくだからです。

しかし、私に正しい方向に向けるだけの時間があれば、それも参考になります。

ここに私のCreateSessionFactoryコードは、いくつかのコンテキストを与えるために、です:

private static ISessionFactory CreateSessionFactory() 
    { 
     ISessionFactory sessionFactory = null; 

     const string autoMapExportDir = "AutoMapExport"; 
     if(!Directory.Exists(autoMapExportDir)) 
      Directory.CreateDirectory(autoMapExportDir); 

     try 
     { 
      var autoPersistenceModel = 
       AutoMap.AssemblyOf<Product>() 
         .Where(t => t.Namespace == "Examples.FirstProject.Entities") 
         .Conventions.Add(DefaultCascade.All()) 
       ; 

      sessionFactory = Fluently.Configure() 
       .Database(SQLiteConfiguration.Standard 
           .UsingFile(DbFile) 
           .ShowSql() 
         ) 
       .Mappings(m => m.AutoMappings.Add(autoPersistenceModel) 
              .ExportTo(autoMapExportDir) 
         ) 
       .ExposeConfiguration(BuildSchema) 
       .BuildSessionFactory() 
       ; 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
     } 

     return sessionFactory; 
    } 

答えて

5

ポール・バタムは、(リンクされたページに移動した後、[ダウンロード]ボタンをクリックしてください)私の質問hereに答えて、スタンドアロンの作業例hereを提供します。

次のコードは彼の答えからコピーされています。要点は、リストの最後にあるStoreMapクラスにあり、EmployeeのIsManagerプロパティを使用するWhere句でオーバーライドを設定します。

マッピングクラス(StoreMapなど)をドメインクラス(Storeなど)と同じ名前空間に入れることはできません(少なくともv。1.0.0.594の場合)。Automapping - で大きな問題が1つあります。

そうでない場合は、NHibernateのは"NHibernate.MappingException: (XmlDocumentオブジェクト)(2,4):XMLの検証エラーを:..." スローされますを、本当の問題が何であるか、またはどこの 全く表示と共に。

これはおそらく、流暢NHibernateはそれ以降のバージョンで修正されるかもしれバグです。ここで

public class Employee 
{ 
    public virtual int Id { get; private set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual bool IsManager { get; set; } 
} 


public class Store 
{ 
    public virtual int Id { get; private set; } 
    public virtual IList<Employee> Staff { get; private set; } 
    public virtual IList<Employee> Managers { get; private set; } 


    public Store() 
    { 
     Staff = new List<Employee>(); 
     Managers = new List<Employee>(); 
    } 


    public void AddManager(Employee employee) 
    { 
     employee.IsManager = true; 
     this.Managers.Add(employee); 
    } 


    public void AddStaff(Employee employee) 
    { 
     this.Staff.Add(employee); 
    } 


} 

は、ストアのマッピングオーバーライドです:

// Must be in different Namespace from class Store!!! 
public class StoreMap : IAutoMappingOverride<Store> 
{ 
    public void Override(AutoMapping<Store> mapping) 
    { 
     mapping.HasMany(x => x.Managers) 
      .Cascade.All() 
      .Where("(IsManager = 1)"); 
     mapping.HasMany(x => x.Staff) 
      .Cascade.All() 
      .Where("(IsManager = 0)"); 
    } 
} 
関連する問題