【问题标题】:NHibernate Issuing Additional UPDATE on Unidirectional One-to-ManyNHibernate 发布关于单向一对多的附加更新
【发布时间】:2012-12-17 22:14:37
【问题描述】:

我在 NHibernate 中使用新的 Map by Code 片段。我的理解是在 NHibernate 3 中进行了更新,以便单向一对多关系不再在外键上插入 null 然后将其更新为正确的值,只要您在集合上设置 inverse=false 并进行外键不可为空。

我看到的是 NHibernate 现在插入了正确的外键,但它仍然发出额外的 UPDATE 将外键设置为插入中使用的值?!?

我是否在映射中做错了什么? (一个用户可以有多个密码。密码对象不会引用我域中的用户。)

mapper.Class<Password>(map =>
{
    map.Table("Passwords");
    map.Id(x => x.Id, x => { x.Generator(Generators.Native); x.Column("PasswordId"); });
    map.Property(x => x.PasswordFormat, x => { x.NotNullable(true); });
    map.Property(x => x.Salt, x => { x.Length(100); });
    map.Property(x => x.PasswordValue, x => { x.NotNullable(true); x.Length(500); });
    map.Property(x => x.CreateDate, x => { x.NotNullable(true); });
});

mapper.Class<User>(map =>
{
    map.Table("Users");
    map.Id(x => x.Id, x => { x.Generator(Generators.Native); x.Column("UserId"); });
    map.Property(x => x.UserName, x => { x.NotNullable(true); x.Length(100); x.UniqueKey("UX_Users_Username"); });
    map.Property(x => x.Email, x => { x.Length(100); x.Index("IX_Users_Email"); });
    map.Property(x => x.IsAnonymous, x => { x.NotNullable(true); });
    map.Property(x => x.IsApproved, x => { x.NotNullable(true); });
    map.Property(x => x.LastActivityDate, x => { x.NotNullable(true); });
    map.Property(x => x.CreateDate, x => { x.NotNullable(true); });
    map.Set(x => x.Passwords, x => { x.Access(Accessor.Field); x.Inverse(false); x.Key(k => { k.Column("UserId"); k.NotNullable(true); k.ForeignKey("FK_Passwords_UserId"); }); x.Cascade(Cascade.All); x.Lazy(CollectionLazy.Lazy); }, x => x.OneToMany());
});

注意:这是使用内置的 NHibernate.Mapping.ByCode,而不是 Fluent NHibernate。

【问题讨论】:

  • 您是否有指向 NH3 中已修复问题的链接?对于这个确切的问题,我总是进行双向一对多...
  • 这里是我引用的链接。请参阅编辑以及 Hazzik 关于该问题的评论。 stackoverflow.com/a/4469471/139694
  • 嗯,当我对 VikciaR 的评论投赞成票时,我记得那个问题......大声笑,我无法让它发挥作用
  • 是的,我也投了赞成票 :) 我无法在 NhForge 或其他任何地方找到任何其他信息,但我确实注意到建议的更改确实导致了正确的插入。我想如果它要进行更新,我至少希望它通过避免空插入来保持引用完整性。我当然希望能够避免将属性添加到关系的密码端,但我可能会这样做以避免更新。 (您有多少次将加密密码重新分配给另一个用户?)
  • 从不,大声笑......对于这些情况,我通常最终给父(用户)一个受保护的设置器并添加一个额外的 ctor 与父作为参数。很明显它不能改变......只有我的 2 美分。

标签: nhibernate nhibernate-mapping


【解决方案1】:

事实证明,我可以通过在 Passwords 集合映射的外键部分设置 k.Update(false) 来完成此操作。

hazzik 对以下问题的回答让我排队。

https://stackoverflow.com/a/11576097/139694

【讨论】:

    【解决方案2】:

    应该是 Inverse() 而不是 Inverse(false)。

    Inverse() 表示其他实体拥有该关系,它负责在插入/更新信息时为 NHibernate 提供有关该关系的数据,即,如果“用户”设置为反向,则需要注意“密码”提供关系信息。到 NHibernate。

    为此,您需要在“密码”实体上设置“用户”参考属性。在创建/更新密码时,明确分配用户属性。

    //create new password
    Password objPassword = new Password();
    objPassword.otherproperties =///assign
    objPassword.User = <<---assign the user property
    

    目前,您有 Inverse(false),这是 NHibernate 的默认设置。在这种情况下,insert 语句将在 passwordid 为 null 的情况下执行,然后更新引用导致两个操作。

    【讨论】:

    • Sundeep,Inverse 需要一个 bool 参数。您是否在考虑 Fluent NHibernate 而不是内置的 NHibernate.Mapping.ByCode?无论如何,它应该是假的,因为父母正在管理关系(密码上没有对用户的引用,因此它无法管理关系)。
    • 对不起。我的错误,我应该将回复删除为不相关的回复。我确实发现了它的不同语法,但认为“逆”将具有相同的含义..
    • Sundeep,如前所述,这是一种单向关系,没有返回给用户的参考。密码永远不会改变所有权,所以我认为没有理由维护对用户的引用,除非它是 NHibernate 知道如何处理关系的限制。虽然您的评论似乎无关紧要,但似乎几乎总是围绕逆属性存在混淆。我认为其他几个人可能有同样的困惑,所以我个人不会要求你删除它。
    猜你喜欢
    • 1970-01-01
    • 2019-10-22
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多