【发布时间】: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