【问题标题】:fluent nhibernate sqlstring produces question mark for the key流利的 nhibernate sqlstring 为键生成问号
【发布时间】:2014-02-16 12:42:35
【问题描述】:

我在 sql 中有很多对很多,我正在尝试使用 nhibernate 映射它。 在努力走到这一步之后,我现在已经接近了,但我的 nhibernate 创建的 sql 字符串中有一个问号,如下所示。我错过了什么吗?

我需要在每个类中创建一个 add 方法来添加另一个实体吗?

谢谢,

我的问题——fluent nhibernate产生的sql字符串

... y=productcat1_.itm_Key WHERE productcat0_.itr_Key=?

对象 A

public class Range : IEntity
{
    public virtual IList<Item> Items { get; set; }
}

对象 B

public class Item : IEntity
{
    public virtual IList<Range> Ranges { get; set; } 
}

映射

// Item mapping
mapping.HasManyToMany(x => x.Ranges)
            .Table("itr_RangeItemsAssoc")
            .ParentKeyColumn("itm_Key")
            .ChildKeyColumn("itr_ItemsKey")
            .Cascade.SaveUpdate().LazyLoad();

// Range mapping
mapping.HasManyToMany(x => x.Items)
            .Table("itr_RangeItemsAssoc")
            .ParentKeyColumn("itr_Key")
            .ChildKeyColumn("itr_ItemRangeKey")
            .Cascade.SaveUpdate().LazyLoad();

更新

已将以下方法添加到我的实体中,尽管我没有在任何地方调用它们..?

public class Range : IEntity
{
    ....

    public virtual void AddItem(Item item)
    {
        item.Ranges.Add(this);
        Items.Add(item);
    }
}

public class Item : IEntity
{
    ...

    public virtual void AddRange(Range range)
    {
        range.Items.Add(this);
        Ranges.Add(range);
    }
}

更新 2 - 映射更正

mapping.HasManyToMany(x => x.Ranges)
            .Table("itr_RangeItemsAssoc")  // name of the look up table
            .ParentKeyColumn("itr_ItemsKey")  // key for item in the lookup table
            .ChildKeyColumn("itm_Key")  // key column in the item table
            .Cascade.SaveUpdate().LazyLoad().Inverse();
    }


mapping.HasManyToMany(x => x.Items)
            .Table("itr_RangeItemsAssoc")  // name of the look up table
            .ParentKeyColumn("itr_ItemRangeKey")  // key for the range in the lookup tablei
            .ChildKeyColumn("itr_Key")  // key column in the range table
            .Cascade.SaveUpdate().LazyLoad();

非常感谢,

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate


    【解决方案1】:

    有两件事要提到。

    首先,多对多由配对表表示,有两列。它们扮演着父子和子父的角色。

    其次,必须将一端标记为反向。项目下方标有.Inverse()

    有一个Item映射的例子

    public class ItemMap : ClassMap<Item>
    {
        public LibraryMap()
        {
             // table, id, other properties
             ...
             HasManyToMany(x => x.Ranges)
                .Table("itr_RangeItemsAssoc")
                .ParentKeyColumn("itr_ItemRangeKey") // not itm_Key
                .ChildKeyColumn("itr_ItemsKey")
                .Cascade.SaveUpdate()
                .LazyLoad();
    

    Range 的相似之处

    HasManyToMany(x => x.Items)
        .Table("itr_RangeItemsAssoc")
        .ParentKeyColumn("itr_ItemsKey") // not itr_Key
        .ChildKeyColumn("itr_ItemRangeKey")
        .Cascade.SaveUpdate()
        .LazyLoad()
        // here, the inverse
        .Inverse() // one end must be marked as inverse
        ;
    

    在这里你可以对背后的映射有所了解:6.8. Bidirectional Associations

    流畅映射多对多的例子可以在这里找到:Mapping-by-Code - OneToMany and other collection-based relation types(文章后半部分)

    【讨论】:

    • 您是说 ParentKeyColumn 应该是“查找”表中列的名称吗?谢谢
    • 请尝试检查我的链接,以了解 NHibernate。 Fluent 只是一种如何用流畅的语法实现相同(xml 映射)的方法。 是的。 Parent 表示键列,child 是另一侧键。反之亦然
    • 看起来我缺少每个类的添加方法?听起来对吗?
    • 没有。它很冷,但不必如此。只需映射:HasManyToMany 两者。然后,您必须确保在代码中,关系的双方都在代码中的某个地方分配。如果这将是方法 Add()... 更好。但它可以是任何地方。只是range.Items.Add(item); item.Ranges.Add(range); 这是一个应该遵循的好习惯......
    • 我已经用更精确的映射更新了我的答案。如果表 itr_RangeItemsAssoc 存在,这不应引发任何异常。我还找到了此处讨论的映射示例:stackoverflow.com/questions/8835658
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多