Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate: Не создается связь may-to-many между объектами в БД / 4 сообщений из 4, страница 1 из 1
01.07.2011, 10:25
    #37331926
Eugene R.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate: Не создается связь may-to-many между объектами в БД
У меня есть класс 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
04.07.2011, 11:34
    #37335132
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate: Не создается связь may-to-many между объектами в БД
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
04.07.2011, 18:08
    #37335937
Eugene R.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate: Не создается связь may-to-many между объектами в БД
SolYUtor,

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

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


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


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