Не удается сохранить поле для Aspnet_Users через NHibernate / ActiveRecord - PullRequest
0 голосов
/ 01 декабря 2011

Я использую ActiveRecord с NHibernate на сервере.Я настроил отображение для пользователей;Я могу создавать / извлекать / регистрировать пользователей без каких-либо проблем.

Теперь я хочу добавить ассоциацию с именем Role для моих пользователей (много пользователей на роль).Я создал соответствующий Role класс, таблицы, данные и т. Д., И, кажется, все работает и с этой целью.

Проблема в том, что когда я сохраняю пользователя и связываю Roleэта связь не сохраняется в базе данных.

Я добавил столбец RoleId (int16) в таблицу aspnet_Users, чтобы соответствовать столбцу 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 et.все?

Некоторые соответствующие сопоставления:

   [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 голосов
/ 01 декабря 2011

Редактировать: mutable = "false" - это ясно означает, что объект доступен только для чтения, что является источником вашей проблемы.

Неизменяемые классы, mutable = "false", не могут быть обновлены или удалены приложением. Это позволяет NHibernate сделать небольшой оптимизация производительности.

Также: Я считаю, что вам нужно определить каскадирование. Вы сохраняете не только саму сущность, но и ссылку на другую сущность. Используйте атрибуты, свободный конфиг или hbml, чтобы определить это так, как вам нужно. Вот варианты каскадирования:

Вот что означает каждая каскадная опция:

  • none - не делать никаких каскадов, пусть пользователи обрабатывают их сами по себе.
  • save-update - когда объект сохраняется / обновляется, проверяйте ассоциации и сохраняйте / обновляйте любой объект, который требует его (включая сохранить / обновить сопоставления в сценарии "многие ко многим".
  • удалить - когда объект удаляется, удаляются все объекты в ассоциации. delete-orphan - когда объект удаляется, удаляются все объекты в ассоциации. В дополнение к этому, когда объект удалены из ассоциации и не связаны с другим объектом (осиротевший), также удалите его.
  • все - когда объект сохраняется / обновляется / удаляется, проверьте соответствие и сохраните / обновите / удалите все найденные объекты.
  • all-delete-orphan - когда объект сохраняется / обновляется / удаляется, проверяйте ассоциации и сохраняйте / обновляйте / удаляйте все найденные объекты. В дополнение к этому, когда объект удален из ассоциации и не связан с другим объектом (осиротевшим), также удалите его.

Возможно, вы захотите прочитать эту статью .

...