2

我正在尝试使用 Fluent NHibnernate 映射多对多集合。我的模型类有这个属性:

public virtual IList<Resource> Screenshots
{
    get { return _screenshots; }
    protected set { _screenshots = value; }
}

我流畅的映射是:

HasManyToMany(x => x.Screenshots)
                .AsList(x => x.WithColumn("Index"))
                .Cascade.AllDeleteOrphan();

当我运行我的应用程序时,我收到以下异常消息:

命名空间“urn:nhibernate-mapping-2.2”中的元素“列表”在命名空间“urn:nhibernate-mapping-2.2”中具有无效的子元素“多对多”。预期的可能元素列表:命名空间“urn:nhibernate-mapping-2.2”中的“索引,列表索引”。

应该有办法做到这一点。有谁知道我做错了什么?

4

1 回答 1

3

当前的 FluentNHibernate 语法如下:

HasManyToMany(x => x.Screenshots)
    .AsList(i => i.Column("`Index`"));

索引列默认为索引,但这是 SQL Server(可能还有其他数据库)上的保留字,因此您必须用反引号引用它。

另外,我建议不要对这种关系设置级联。考虑以下代码:

x.Screenshots.Remove(s);
session.SaveOrUpdate(x);

即使没有指定级联,NHibernate 也会正确地从链接表中删除行。但是,如果您指定 AllDeleteOrphan,则 NHibernate 将从链接表中删除该行并删除 Resource s。我怀疑这是您在多对多关系中想要的行为。

于 2011-05-07T05:05:50.117 回答