2010-12-18 15 views
3

私は流暢なNhibernateを使って簡単なクラスをマップしています
そして、このクラスをMySQL DBで作成するためにSchema Generationを使用しています。私は(私は、クロスランゲージのドメインクラスをマッピングしています)私の性質のためのIList <>を使用することはできません

だから私は単純な配列を使用する必要があります。..単純な配列のマッピング

私はNHibernateは、2つの間の接続テーブルを作成したいですクラス、
これらは、ドメインクラスです:

public class ClassOne 
    { 
     public virtual Guid Guid { get; set; } 
     public virtual String Title { get; set; } 
     public virtual ClassTwo[] Tags { get; set; } 
    } 

    public class ClassTwo 
    { 
     public virtual Guid Guid { get; set; } 
     public virtual string Title { get; set; } 
    } 

そして、これはマップである:

public class ClassOneMap : ClassMap<ClassOneMap> 
    { 
     public ClassOneMap() 
     { 
      Id(x => x.Guid).GeneratedBy.GuidComb(); 
      Map(x => x.Title); 
      HasManyToMany(x => x.Tags) 
       .Cascade.SaveUpdate()); 

     } 
    } 

    public class ClassTwoMap : ClassMap<ClassTwo> 
    { 
     public ClassTwoMap() 
     { 
      Id(x => x.Guid).GeneratedBy.GuidComb(); 
      Map(x => x.Title); 
     } 
    } 

スキーマが素晴らしい!それはClassOne、ClassTwoとClassTwoToClassOneテーブルを持っています しかし、私はClassOneのインスタンスを永続化しようとしていますが、無効なキャスト例外があります.. これは、IListの配列を変更することによって解決されますが、

スキーマアーキテクチャを変更せずに配列を使用するようにFluentマッピングを設定する方法を教えてもらえますか?

ありがとうございました!

+0

私は好奇心が強い、他のどのようなあなたはIListを許さない言語を使っていますか? –

答えて

2

[OK]をこの周りで遊んで、質問を解決することを願っています。

ので、モデルは以下のとおりです。

public class ClassOne : Entity 
    { 
     public virtual string Title { get; set; } 

     public virtual ClassTwo[] Tags { get; set; } 

    } 

    public class ClassTwo : Entity 
    { 
     public virtual string Title { get; set; } 
    } 

基底クラス私の場合に長いID定義が含まれています。 GUIDの

マッピングクラスで問題になることはありません:私たちはいくつかの大会でFluentNhibernateを使用している、また、アイデアは、あなたがParentKey、ChildKey表を示していない場合、それはないことに注意してくださいHasManyToMany

public class ClassOneMappingOverride : IAutoMappingOverride<ClassOne> 
    { 
     public void Override(AutoMapping<ClassOne> mapping) 
     { 
      mapping.HasManyToMany(x => x.Tags).AsArray(x => x.Id).ParentKeyColumn("classOneId") 
       .ChildKeyColumn("classTwoId") 
       .Table("ClassOneLinkClassTwo") 
       .Cascade.SaveUpdate(); 
     } 
    } 

でありますリンクテーブルを作成します。

挿入データがどのように見えるのユニットテスト:

public class ClassOneDataPart : DataPartBase, IDataPart 
{ 
    public void AddToDatabase() 
    { 
     var classOne = new ClassOne { Title = "classOne" }; 

     var classTwo1 = new ClassTwo { Title = "class21" }; 
     var classTwo2 = new ClassTwo { Title = "class22" }; 

     var tags = new[] { classTwo1, classTwo2 }; 

     classOne.Tags = tags; 

     this.SaveData(classOne); 
     this.SaveData(classTwo1); 
     this.SaveData(classTwo2); 
    } 
} 

とデータベースへの結果は次のとおりです。

alt text

よろしく、 イオン

0

.AsArray(X => x.Id)を使用してみてください

+0

ありがとうございましたが、私はすでにそれを試みました。スキーマジェネレータは、ManyToManyテーブルをClassTwoテーブル(すべてのデータを保持しています)に置きます。 –

1

は、プライベートフィールドとして収集の地図と配列として、それを公開します。これにより、配列を操作することなく、AddTagおよびRemoveTagメソッドを簡単に公開することもできます。

public class ClassOne 
{ 
    private IList<ClassTwo> _tags; 

    public virtual Guid Guid { get; set; } 
    public virtual String Title { get; set; } 
    public virtual ClassTwo[] Tags 
    { 
     // possibly expose as method to hint that the array is re-built on every call 
     get { return _tags.ToArray(); } 
    } 
} 

public class ClassOneMap : ClassMap<ClassOne> 
{ 
    public ClassOneMap() 
    { 
     Id(x => x.Guid).GeneratedBy.GuidComb(); 
     Map(x => x.Title); 
     HasManyToMany(x => x.Tags).Access.CamelCaseField(Prefix.Underscore) 
      .Cascade.SaveUpdate()); 

    } 
} 
関連する問題