多対多のテーブル構造を、キーが1つのテーブルにあり、値が別のテーブルにあるディクショナリにマップしようとしています。
table Rows [Row_ID]
table Columns [Column_ID, Column_Name]
table Cells [Cell_ID, Row_ID, Column_Id, Cell_Value]
public class Row {
public Row() {
this.Cells = new Dictionary<string, Cell>();
}
public virtual long Id { get; protected set; }
public virtual IDictionary<string, Cell> Cells { get; set; }
}
public class RowMap : ClassMap<Row> {
public RowMap() {
Table("Rows");
Id(m => m.Id, "Row_Id").GeneratedBy.Identity();
HasManyToMany<Column>(m => m.Cells).Table("Cells")
.ParentKeyColumn("Row_Id").ChildKeyColumn("Column_Id")
.AsMap<string>("Column_Name").Inverse().Cascade.All();
}
}
public class Column {
public virtual long Id { get; protected set; }
public virtual string Name { get; set; }
}
public class ColumnMap : ClassMap<Column> {
public ColumnMap() {
Table("Columns");
Id(m => m.Id, "Column_Id").GeneratedBy.Identity();
Map(m => m.Name, "Column_Name").Not.Nullable();
}
}
public class Cell {
public virtual long Id { get; protected set; }
public virtual string Value { get; set; }
public virtual Column Column { get; set; }
public virtual Row Row { get; set; }
}
public class CellMap : ClassMap<Cell> {
public CellMap() {
Id(m => m.Id, "Cell_Id").GeneratedBy.Identity();
Map(m => m.Value, "Cell_Value").Not.Nullable();
References(m => m.Column, "Column_Id");
References(m => m.Row, "Row_Id");
}
}
すべてが正しくコンパイルされますが、Cellsコレクションにアクセスしようとすると、次のエラーが発生します。
could not initialize a collection: [Sandbox.Row.Cells#1][SQL: SELECT cells0_.Row_Id as
Row1_1_, cells0_.Column_Id as Column2_1_, cells0_.Column_Name as Column3_1_,
column1_.Column_Id as Column1_8_0_, column1_.Column_Name as Column2_8_0_ FROM Cells
cells0_ left outer join Columns column1_ on cells0_.Column_Id=column1_.Column_Id WHERE
cells0_.Row_Id=?]
エラーメッセージを確認した後、クエリが列テーブルではなくセルテーブルのフィールドとしてキー「Column_Name」にアクセスしようとしていることがわかりました。
これを正しいテーブルにマップするようにNHibernateに指示する方法についてのアイデアはありますか、それとも私がしようとしていることは不可能ですか?