C# 流利的NHibernate词典<;字符串、实体>;使用3个表

C# 流利的NHibernate词典<;字符串、实体>;使用3个表,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我试图将多对多表结构映射到一个字典,其中键在一个表中,值在另一个表中 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>();

我试图将多对多表结构映射到一个字典,其中键在一个表中,值在另一个表中

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");
    }
}
查看错误消息后,我看到查询正在尝试将键“Column_Name”作为Cells表中的字段而不是Columns表中的字段进行访问


关于如何让NHibernate将其映射到正确的表,或者我正在尝试做的是不可能的,您有什么想法吗?

hasmanytomany(中间表:单元格,单元格的EntityTable:Cells)中从未提到columns表,因此根本无法引用它。我现在看到的唯一选择就是把字典改成中文

public virtual IDictionary<Column, Cell> Cells { get; private set; }

HasMany(m => m.Cells)
    .Table("Cells")
    .KeyColumn("Row_Id")
    .AsEntityMap("Column_id")
    .Inverse().Cascade.All();
公共虚拟IDictionary单元格{get;private set;}
HasMany(m=>m.Cells)
.表格(“单元格”)
.KeyColumn(“行Id”)
.AsEntityMap(“列id”)
.Inverse().Cascade.All();

您可以在column.Name到column实例之间保存一个全局字典,以保存往返或将column名称反规范化到cells表中。

您尝试过column.Name吗?我从未使用字典进行映射,这似乎很有趣。我尝试过将AsMap(“Column_Name”)更改为AsMap(index=>index.Name),但它所做的只是将查询更改为引用Cells表上的“Name”而不是“Column_Name”。您能试试Column.Name吗?使用类名和属性名在某种程度上是FluentI的惯例,我不确定我是否理解您的意思。也许你正在谈论的一个例子会有所帮助。而不是
.AsMap(“Column_Name”).Inverse().Cascade.All()尝试
.AsMap(“Column.Name”).Inverse().Cascade.All()我最后添加了一个表实体,并将列引用为字典集合,然后使用此集合引用列。(即table.Rows[0].Cells[table.Columns[“ColumnName”]].Value)不完全是我想要的,但它可以工作,这才是重要的。我仍然很想用另一种方式去做,但我不会让自己发疯去想办法。谢谢你的帮助!
public virtual IDictionary<Column, Cell> Cells { get; private set; }

HasMany(m => m.Cells)
    .Table("Cells")
    .KeyColumn("Row_Id")
    .AsEntityMap("Column_id")
    .Inverse().Cascade.All();