Database 如何阻止Fluent NHibernate创建外键

Database 如何阻止Fluent NHibernate创建外键,database,nhibernate,fluent-nhibernate,nhibernate-mapping,foreign-keys,Database,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,Foreign Keys,我得到了如下示例中的多态关系: 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 v

我得到了如下示例中的多态关系:

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; }
}
只要您只使用一个子类型,这就可以正常工作,因为shema导出生成一个外键,将“child_ID”限制为导出时首先命中的任何表的ID(在本例中为B)

var b=session.Get(id);
b、 添加(someA);
tx.Commit();//很好
var c=session.Get(id);
c、 添加(someA);
tx.Commit();//由于FK约束而崩溃

我可以阻止FluentNHibernate创建此FK吗?当我在谷歌上搜索这个问题时,我注意到HBM样本在多对一关系中具有foreign key=“no”属性。所以NHibernate应该能解决这个问题,对吗?但是,我希望保留我的fluent映射,因为我可以通过这种方式为我的所有子类型创建一个通用的基本映射类,目前我们所有的映射都是FNH映射。

我对FluentNHibernate不太熟悉,但我假设您可以使用以下方法在集合的映射上设置此自定义属性:


.SetAttribute(“外键”,“否”)

我对FluentNHibernate不太熟悉,但我假设您可以使用以下方法在集合的映射上设置此自定义属性:

.SetAttribute(“外键”、“否”)
这应该可以做到:

HasManyToMany(x => x.As)
  .ForeignKeyConstraintNames("no", "no");
这应该做到:

HasManyToMany(x => x.As)
  .ForeignKeyConstraintNames("no", "no");

无法验证它,直到明天在工作中,但我相对肯定,没有对映射SetAttribute方法。我已经在配置对象上使用了这个方法来设置批量大小,我的第一个想法是在映射定义上使用相同的方法。@Zebi:我相信你是对的;在查看FluentNHibernate文档时,您似乎无法在集合映射上使用.SetAttribute()。只是想让automapper指向一个稍微不同的测试用例(b+c获得一个IChild接口,一个获取IChild列表),然后观察会发生什么。它将导致多对任意映射。。。也许它就是这样得到映射的。大约一年前,
SetAttribute
方法被删除了,你应该更喜欢方法调用(
SetAttribute(“外键”,“xxx”)
->
ForeignKey(“xxx”)
等等。)无法验证它,直到明天在工作中,但我相对肯定,没有对映射SetAttribute方法。我已经在配置对象上使用了这个方法来设置批量大小,我的第一个想法是在映射定义上使用相同的方法。@Zebi:我相信你是对的;在查看FluentNHibernate文档时,您似乎无法在集合映射上使用.SetAttribute()。只是想让automapper指向一个稍微不同的测试用例(b+c获得一个IChild接口,一个获取IChild列表),然后观察会发生什么。它将导致多对任意映射。。。也许它就是这样得到映射的。
SetAttribute
方法大约在一年前就被删除了,你应该更喜欢方法调用(
SetAttribute(“外键”,“xxx”)
->
ForeignKey(“xxx”)
等等)!非常感谢你。我认为ForeignKeyConstraintNames方法定义了命名模式,因此键的命名不像随机十六进制值那样;)它也能做到这一点。这相当于其他人提到的外键属性。ForeignKeyConstraintNames(“否”、“否”)不起作用(至少在我目前在一个项目中使用的Fluent NHibernate 1.3.0.717中是这样)。好的是,ForeignKeyConstraintNames(“none”,“none”)确实如此:)这听起来像是NHibernate基本行为的变化。不过接得好,谢谢。就这样!非常感谢你。我认为ForeignKeyConstraintNames方法定义了命名模式,因此键的命名不像随机十六进制值那样;)它也能做到这一点。这相当于其他人提到的外键属性。ForeignKeyConstraintNames(“否”、“否”)不起作用(至少在我目前在一个项目中使用的Fluent NHibernate 1.3.0.717中是这样)。好的是,ForeignKeyConstraintNames(“none”,“none”)确实如此:)这听起来像是NHibernate基本行为的变化。好的,谢谢。
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
HasManyToMany(x => x.As)
  .ForeignKeyConstraintNames("no", "no");