Nhibernate ManyToMany具有动态where子句

时间:2010-10-22 09:48:40

标签: nhibernate fluent-nhibernate

我有一些问题在fluentnhibernate中映射复杂的多对多关系。我有一个遗留数据库,看起来像这样:

Foos:| Id | Foo |

FooBars:| FooId | BarId |

酒吧:| Id |酒吧| CultureId |

我试图映射到以下对象模型:

class Foo
{
   property virtual int Id { get; set; }
   property virtual string Foo { get; set; }
   property virtual IList<Bar> Bars { get; set; }
}

class Bar
{
   property virtual int Id { get; set; }
   property virtual int CultureId { get; set; }
}

使用映射:

public class FooMapping : ClassMap<Foo>
{
    public FooMapping()
    {
        Table("foos");
        Id(v => v.Id);
        Map(v => v.Foo);

        HasManyToMany(v => v.Bars)
            .Table("FooBars")
            .ParentKeyColumn("FooId")
            .ChildKeyColumn("BarId")
            .Cascade.All();
    }
}

public class BarMapping : ClassMap<Bar>
{
    public BarMapping()
    {
        Table("bars");
        Id(v => v.Id);
        Map(v => v.Bar);
        Map(v => v.CultureId);
    }
}

问题是我有多个Bar,其中不同的CultureIds具有相同的ID

e.g。

我会有一张看起来像的表:

ID |酒吧| CultureId

1,你好,1

1,Bonjour,2

1,Gutentag,3

目前,上表的Bars属性将返回3个元素,但其上的Bar属性将返回所有三个元素的“Hello”(可能是因为它们都具有相同的标识)。所以我的问题是,我怎么能阻止这种情况发生任何人都可以建议一种过滤没有正确文化ID的行的方法(注意,这是动态的&amp;基于当前的文化) ?

1 个答案:

答案 0 :(得分:0)

您无法在映射中创建动态where子句。您将需要使用Criteria或HQL查询来查询此集合,而不是通过父集合访问它。您可以阅读filters,但仍需要查询。