NHibernate在单向一对多上发布附加更新

时间:2012-12-17 22:14:38

标签: nhibernate nhibernate-mapping

我在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。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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

为此,您需要在“密码”实体上设置“用户”引用属性。在创建/更新密码时,请明确指定用户属性。

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

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