我得到了一个多态关系,如下例所示:
public class A
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
}
B级& C包含A的列表:
public class B/C
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<A> As { get; set; }
public virtual SomeParent Parent { get; set; }
}
我的目标是像
这样的查询session.Linq<B>().Where(x => x.Parent == someParent && x.As.Contains(someA));
目前,我在B =&gt;之间配置了多对多关系。 A和C =&gt;使用共享链接表因为我希望在一个表中包含所有链接。 在这个考试中,NH shema导出创建了4个表,A,B,C和ChildToA。
HasManyToMany(x => x.As)
.AsBag()
.Table("XX_ChildToA")
.ParentKeyColumn("Child_ID")
.ChildKeyColumn("A_ID")
.Cascade.All()
只要您只使用一个子类型,这样就可以正常工作,因为shema export会生成一个外键,将“Child_ID”限制为导出时首先遇到的任何表的ID(在本例中为B)。
var b = session.Get<B>(id);
b.As.Add(someA);
tx.Commit(); // works fine
var c = session.Get<C>(id);
c.As.Add(someA);
tx.Commit(); // crashes because of FK constraint
我可以阻止FluentNHibernate创建此FK吗?当我搜索谷歌这个问题时,我注意到HBM样本在多对一关系中具有foreign-key =“no”属性。所以NHibernate应该能够解决这个问题吧?但是我想保留我的流畅映射,因为我可以通过这种方式为我所有的子类型创建一个通用的基本映射类,目前我们所有的映射都是FNH映射。
答案 0 :(得分:2)
这应该这样做:
HasManyToMany(x => x.As)
.ForeignKeyConstraintNames("no", "no");
答案 1 :(得分:1)
我并不完全熟悉FluentNHibernate,但我假设您可以使用以下内容在集合的映射上设置此自定义属性:
.SetAttribute("foreign-key", "no")