powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate: Не создается связь may-to-many между объектами в БД
4 сообщений из 4, страница 1 из 1
NHibernate: Не создается связь may-to-many между объектами в БД
    #37331926
Eugene R.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть класс Permission:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class Permission : IEntity
{
        protected Permission()
        {
        }

        public Permission(string name, string mneminic)
        {
            Description = name;
            Mnemonic = mneminic;
        }

        public virtual int Id { get; set; }
        public virtual string Description { get; protected set; }
        public virtual string Mnemonic { get; protected set; }
 }
а также класс UserRole:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
public class UserRole : IEntity
    {
        private readonly ISet<Permission> _permissions;

        protected UserRole() { }

        public UserRole(string name)
        {
            Name = name;
            _permissions = new HashSet<Permission>();
        }

        public virtual int Id { get; protected set; }

        public virtual string Name { get; protected set; }

        public virtual ReadOnlyCollection<Permission> Permissions
        {
            get { return new ReadOnlyCollection<Permission>(new List<Permission>(_permissions)); }
        }

        public virtual bool HasPermission(string mnemonic)
        {
            return _permissions.Any(x => x.Mnemonic.Equals(mnemonic, StringComparison.OrdinalIgnoreCase));
        }

        public virtual void AddPermission(Permission permission)
        {
            if (!_permissions.Contains(permission))
            {
                _permissions.Add(permission);
            }
        }

        public virtual void RemovePermission(Permission permission)
        {
            if (_permissions.Contains(permission))
            {
                _permissions.Remove(permission);
            }
        }
    }
Вот их маппинги:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class PermissionMapping : ClassMap<Permission>
    {
        public PermissionMapping()
        {
            Id(x => x.Id);

            Map(x => x.Description);
            Map(x => x.Mnemonic);
        }
    }
и
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class UserRoleMapping : ClassMap<UserRole>
    {
        public UserRoleMapping()
        {
            Id(x => x.Id);
            Map(x => x.Name);

            HasManyToMany(x => x.Permissions)
                .AsSet()
                .Access.CamelCaseField(Prefix.Underscore)
                .Cascade.SaveUpdate()
                .ParentKeyColumn("RoleId")
                .ChildKeyColumn("PermissionId")
                .Table("[Roles_Permissions]");
        }
    }

Я пытаюсь сделать что-то вроде следующего:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var p1 = new Permission("Permission1", PermissionMnemonics.CanEditClaims);
var p2 = new Permission("Permission2", PermissionMnemonics.CanEditRoles);
var p3 = new Permission("Permission3", PermissionMnemonics.ClaimDontRequireAccept);
var p4 = new Permission("Permission4", PermissionMnemonics.CanAcceptClaim);

Session.SaveOrUpdate(p1);
Session.SaveOrUpdate(p2);
Session.SaveOrUpdate(p3);
Session.SaveOrUpdate(p4);

var role = new UserRole("Администратор");
role.AddPermission(p1);
role.AddPermission(p3);

Session.SaveOrUpdate(role);
Смотрю базу: все Permissions созданы, UserRole создана, а связи между ними почему-то не создано. Вот запросы, которые сгенерил NHibernate:
Код: plaintext
1.
2.
3.
4.
5.
NHibernate: INSERT INTO [Permission] (Description, Mnemonic) VALUES (@p0, @p1); select SCOPE_IDENTITY();@p0 = 'Permission1' [Type: String ( 4000 )], @p1 = 'EditClaims' [Type: String ( 4000 )]
NHibernate: INSERT INTO [Permission] (Description, Mnemonic) VALUES (@p0, @p1); select SCOPE_IDENTITY();@p0 = 'Permission2' [Type: String ( 4000 )], @p1 = 'EditRoles' [Type: String ( 4000 )]
NHibernate: INSERT INTO [Permission] (Description, Mnemonic) VALUES (@p0, @p1); select SCOPE_IDENTITY();@p0 = 'Permission3' [Type: String ( 4000 )], @p1 = 'ClaimDontRequireAccept' [Type: String ( 4000 )]
NHibernate: INSERT INTO [Permission] (Description, Mnemonic) VALUES (@p0, @p1); select SCOPE_IDENTITY();@p0 = 'Permission4' [Type: String ( 4000 )], @p1 = 'AcceptClaim' [Type: String ( 4000 )]
NHibernate: INSERT INTO [UserRole] (Name) VALUES (@p0); select SCOPE_IDENTITY();@p0 = 'Администратор' [Type: String ( 4000 )]
В чем может быть ошибка?
...
Рейтинг: 0 / 0
NHibernate: Не создается связь may-to-many между объектами в БД
    #37335132
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene R.В чем может быть ошибка?

У вас изменения, существующие в сессии не сбрасываются в базу. Допишите в конце session.Flush(), и вуаля:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
NHibernate: 
    INSERT 
    INTO
        "Permission"
        (Description, Mnemonic) 
    VALUES
        (@p0, @p1);
    select
        last_insert_rowid();
    @p0 = 'Permission1' [Type: String ( 0 )],
    @p1 = 'CanEditClaims' [Type: String ( 0 )]
NHibernate: 
    INSERT 
    INTO
        "Permission"
        (Description, Mnemonic) 
    VALUES
        (@p0, @p1);
    select
        last_insert_rowid();
    @p0 = 'Permission2' [Type: String ( 0 )],
    @p1 = 'CanEditRoles' [Type: String ( 0 )]
NHibernate: 
    INSERT 
    INTO
        "Permission"
        (Description, Mnemonic) 
    VALUES
        (@p0, @p1);
    select
        last_insert_rowid();
    @p0 = 'Permission3' [Type: String ( 0 )],
    @p1 = 'ClaimDontRequireAccept' [Type: String ( 0 )]
NHibernate: 
    INSERT 
    INTO
        "Permission"
        (Description, Mnemonic) 
    VALUES
        (@p0, @p1);
    select
        last_insert_rowid();
    @p0 = 'Permission4' [Type: String ( 0 )],
    @p1 = 'CanAcceptClaim' [Type: String ( 0 )]
NHibernate: 
    INSERT 
    INTO
        "UserRole"
        (Name) 
    VALUES
        (@p0);
    select
        last_insert_rowid();
    @p0 = 'Администратор' [Type: String ( 0 )]
NHibernate: 
    INSERT 
    INTO
        [
        Roles_Permissions] (
            RoleId, PermissionId
        ) 
    VALUES
        (@p0, @p1);
    @p0 =  1  [Type: Int32 ( 0 )], @p1 =  1  [Type: Int32 ( 0 )]
NHibernate: 
    INSERT 
    INTO
        [
        Roles_Permissions] (
            RoleId, PermissionId
        ) 
    VALUES
        (@p0, @p1);
    @p0 =  1  [Type: Int32 ( 0 )], @p1 =  3  [Type: Int32 ( 0 )]
...
Рейтинг: 0 / 0
NHibernate: Не создается связь may-to-many между объектами в БД
    #37335937
Eugene R.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SolYUtor,

Блин, спасибо.
Перед тем, как прочитать сообщение, успел дойти до того, что если действия заключить в транзакцию, то тоже все правильно срабатывает.

Еще раз спасибо
...
Рейтинг: 0 / 0
NHibernate: Не создается связь may-to-many между объектами в БД
    #37336139
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene R.SolYUtor,
Перед тем, как прочитать сообщение, успел дойти до того, что если действия заключить в транзакцию, то тоже все правильно срабатывает.


Это почти тоже самое, только ваш вариант с транзакцией правильней. Дело в том, что у сессии есть свойство FlushMode. По-умолчанию сброс изменений в бд происходит как раз при фиксации транзакции.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate: Не создается связь may-to-many между объектами в БД
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]