插入后,NHibernate仍然会发布更新

Dav*_*ita 10 mapping nhibernate fluent-nhibernate

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

    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");
    }
Run Code Online (Sandbox Code Playgroud)

根据nhibernate 3及更高版本之后的这篇文章,将key设置为non-nullable应该修复insert-update问题(当NHibernate发出插入时外键设置为null然后更新以更新外键以纠正值时的问题) ,但事实并非如此.当我将密钥设置为不可为空时,NHibernate会发出正确的插入语句

INSERT INTO ContactNumbers
            (Number,
             ContactId)
VALUES      ('(212) 121-212' /* @p0 */,
             10 /* @p1 */);
Run Code Online (Sandbox Code Playgroud)

如您所见,它会插入ContactId字段,但在此之后,它仍会发出update语句

UPDATE ContactNumbers
SET    ContactId = 10 /* @p0 */
WHERE  Id = 34 /* @p1 */
Run Code Online (Sandbox Code Playgroud)

所以要澄清问题.NHibernate使用正确分配的外键插入Contact行,然后发出更新语句以更新冗余的外键(ContactId).

如何摆脱这种冗余的更新声明?谢谢.

顺便说一下,我正在使用最新版本的NHibernate和Fluent NHibernate.数据库是SQLite

haz*_*zik 22

您必须设置"updatable"=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");
}
Run Code Online (Sandbox Code Playgroud)

  • 当所有的希望都消失了,你来了:D.简单,清晰,完美.它甚至用单个删除替换了更新/删除操作.该死的,你不知道我多么感激.这是许多人都不知道的重要问题.谢谢hazzik. (2认同)