我在后端使用ActiveRecord和NHibernate。我为用户设置了一个映射;我可以毫无问题地创建/检索/注册用户。
我现在想要为我的用户添加一个名为Role
的关联(每个角色有很多用户)。我已经创建了适当的Role
类,表格,数据等等,所有内容似乎都在为此而努力。
问题在于,当我保存用户并关联Role
时,该关联不会持久存储到数据库中。
我在RoleId (int16)
表中添加了aspnet_Users
列,以匹配Role表的Id (int16)
列。我尝试使用Save
和SaveAndFlush
但没有成功。
以下是一些代码:
Role superUser = Role.First(r => r.name == "Super User");
User me = User.First(r => r.UserName == myUserName);
me.Role = superUser;
me.Save(); // Or: SaveAndFlush
调试时,我可以看到对象在保存时的关联(即me.Role
不为空且具有正确的属性/属性/等。)但是,当我查看数据库时,该用户的RoleId
值仍为NULL
。 (SaveAndFlush
没有任何区别。)
我错过了什么?
我在SO上的某处读过扩展用户表通常是通过添加另一个表并用外键链接这两个表来完成的。我假设这些类将使用新的ExtendedUser
类的合成继承。假设我不想走这条路,为什么这不起作用?是因为特定的ASP.NET MVC存储过程等。所有?
一些相关的映射:
[ActiveRecord("aspnet_Users", Mutable = false)]
public class User : ActiveRecordLinqBase<User>
{
[PrimaryKey(PrimaryKeyType.Assigned)]
public Guid UserId { get; set; }
// ...
[BelongsTo("RoleId", Cascade = CascadeEnum.SaveUpdate)]
public Role Role { get; set; }
}
[ActiveRecord]
public class Role : ActiveRecordLinqBase<Role>
{
[PrimaryKey]
public int Id { get; set; }
// ...
[HasMany(Inverse = true)]
public IList<User> Users { get; set; }
[Property]
public string Name { get; set; }
}
答案 0 :(得分:0)
编辑: mutable =“false” - 这显然认为该实体是只读的,这是您问题的根源。
应用程序可能无法更新或删除不可变类,mutable =“false”。这允许NHibernate做一些小事 性能优化。
此外: 我相信你需要定义级联。您不仅仅保存实体本身,还引用其他实体。使用属性,fluent配置或hbml以您需要的方式定义它。以下是级联选项:
以下是每个级联选项的含义:
您可能需要阅读this article。