NHibernate在插入后仍会发布更新

NHibernate在插入后仍会发布更新,nhibernate,fluent-nhibernate,mapping,Nhibernate,Fluent Nhibernate,Mapping,我有一个非常简单的单向映射。见下文: public ContactMap() { Id(x => x.Id).GeneratedBy.Assigned(); Map(x => x.Name); References(x => x.Device); HasMany(x => x.Numbers) .Not.Inverse() .Not.KeyNul

我有一个非常简单的单向映射。见下文:

    public ContactMap()
    {
        Id(x => x.Id).GeneratedBy.Assigned();
        Map(x => x.Name);
        References(x => x.Device);
        HasMany(x => x.Numbers)
            .Not.Inverse()
            .Not.KeyNullable()
            .Cascade.AllDeleteOrphan()
            .Not.LazyLoad()
            .Fetch.Subselect();
        Table("Contacts");
    }


    public PhoneNumberMap()
    {
        Id(x => x.Id).GeneratedBy.Native();
        Map(x => x.Number);
        Table("ContactNumbers");
    }
根据nhibernate 3及以上版本后的说法,将key设置为non-null应该可以解决insert更新问题(当nhibernate发出一个外键设置为null的insert,然后更新以将外键更新为正确值时的问题),但我不是这样。当我将键设置为不可为null时,NHibernate会发出正确的insert语句

INSERT INTO ContactNumbers
            (Number,
             ContactId)
VALUES      ('(212) 121-212' /* @p0 */,
             10 /* @p1 */);
UPDATE ContactNumbers
SET    ContactId = 10 /* @p0 */
WHERE  Id = 34 /* @p1 */
如您所见,它插入了ContactId字段,但在此之后,它仍然发出update语句

INSERT INTO ContactNumbers
            (Number,
             ContactId)
VALUES      ('(212) 121-212' /* @p0 */,
             10 /* @p1 */);
UPDATE ContactNumbers
SET    ContactId = 10 /* @p0 */
WHERE  Id = 34 /* @p1 */
所以要澄清问题。NHibernate插入正确分配外键的联系人行,然后发出update语句来更新冗余的外键(ContactId)

我怎样才能去掉这个多余的update语句? 谢谢


顺便说一句,我正在使用最新版本的NHibernate和流利的NHibernate。数据库是SQLite

我不知道你是否真的能摆脱它

尝试将另一个id生成器用作本机id生成器。它强制NH插入记录只是为了获取id。该id用于会话中的每个实体,因此它以后无法进行插入。它可能会导致后续更新。使用hi-lo或类似的语言

编辑

在这种情况下,为什么不使用组件?如果电话号码只包含一个号码,则不需要单独映射电话号码。类似这样的情况(我不是FNH用户,所以可能是错误的):

从3.2.0测试版开始,您就无法访问

在v3.2.0 BETA版中,一对多的改进将这种异常引入了单向一对多关系(实际上我不确定异常是否就是你所说的)

在3.2版本之前,您需要设置外键以允许这种类型的关系使用null。因此,我会忽略这一事实,只是顺其自然。否则,您需要将其更改为完全双向关系

  • [NH-941]-需要可空外键的一个或多个


编辑此外,您指向的帖子的答案是修复
保存空保存更新
,而不是修复附加更新

尝试在映射上将
反向
设置为
,并在代码中分配关系

Inverse
表示孩子负责持有父母的ID

e、 g

这样,当您插入电话号码记录时,NH可以插入ContactId,而无需单独更新


这就是我过去在NH2中所做的,我假设在NH3中这种行为仍然有效。

特雷弗·皮利(Trevor Pilley)就是这么说的。使用
inverse=“true”
。如果您选择不使用
inverse=“true”
,这就是该选择的结果。您不能两全其美。

您必须将
的“updateable”=false设置为您的密钥,以防止更新

public ContactMap()
{
    Id(x => x.Id).GeneratedBy.Assigned();
    Map(x => x.Name);
    References(x => x.Device);
    HasMany(x => x.Numbers)
        .Not.Inverse()
        .Not.KeyNullable()
        .Not.KeyUpdate() // HERE IT IS
        .Cascade.AllDeleteOrphan()
        .Not.LazyLoad()
        .Fetch.Subselect();
    Table("Contacts");
}

我不想做相反的事情,这就是全部的想法。我想让联系人负责数字的持久性。该死,Nhibernate对单向关联的支持糟透了。我会等待其他答案,如果没有好的结果,我会接受你的答案。同时,我将首先检查EF+代码:(对不起,我不明白你的意思。请你详细说明一下好吗?:)我将id生成更改为HiLo,但没有帮助。组件在这里不起作用,它与数字有一对多的关系。它是组件的集合。看,当所有的希望都破灭时,你来了:D.简单、清晰、完美。它甚至用单次删除取代了更新/删除操作。该死,你不知道我有多感激。这是一个许多人没有意识到的重要问题。谢谢hazzik。是的,我们应该更新我们的文档,但这是一项巨大而枯燥的工作:(我不知道这一点,并且已经使用NHibernate一段时间了!很好的一个hazzik