无法通过NHibernate / ActiveRecord将字段保留到Aspnet_Users

时间:2011-12-01 14:12:25

标签: asp.net-mvc-3 castle-activerecord

我在后端使用ActiveRecord和NHibernate。我为用户设置了一个映射;我可以毫无问题地创建/检索/注册用户。

我现在想要为我的用户添加一个名为Role的关联(每个角色有很多用户)。我已经创建了适当的Role类,表格,数据等等,所有内容似乎都在为此而努力。

问题在于,当我保存用户并关联Role时,该关联不会持久存储到数据库中。

我在RoleId (int16)表中添加了aspnet_Users列,以匹配Role表的Id (int16)列。我尝试使用SaveSaveAndFlush但没有成功。

以下是一些代码:

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; }
    }

1 个答案:

答案 0 :(得分:0)

编辑: mutable =“false” - 这显然认为该实体是只读的,这是您问题的根源。

  

应用程序可能无法更新或删除不可变类,mutable =“false”。这允许NHibernate做一些小事   性能优化。

此外: 我相信你需要定义级联。您不仅仅保存实体本身,还引用其他实体。使用属性,fluent配置或hbml以您需要的方式定义它。以下是级联选项:

以下是每个级联选项的含义:

  • none - 不做任何级联,让用户处理它们 自己。
  • save-update - 保存/更新对象时,检查协议并保存/更新任何需要它的对象(包括 在多对多场景中保存/更新协议。)
  • delete - 删除对象时,删除该组中的所有对象。    delete-orphan - 删除对象时,删除该组中的所有对象。除此之外,当一个对象是 从联系中删除而不与另一个对象相关联 (孤儿),也删除它。
  • all - 当对象保存/更新/删除时,检查协议并保存/更新/删除找到的所有对象。
  • all-delete-orphan - 当对象保存/更新/删除时,检查协议并保存/更新/删除找到的所有对象。除此之外,当从对象中删除一个对象并且没有与另一个对象(孤立对象)相关联时,也将其删除。

您可能需要阅读this article