2012-02-05 1 views
0

Я должен лиц:NHibernate многие-ко-многим с Каскады

public class User 
{ 
    public virtual long Id { get; set; } 
    public virtual long Name { get; set; } 
} 

public class Group 
{ 
    public virtual long Id { get; set; } 
    public virtual long Name { get; set; } 
} 

Подключенные следующим образом:

public class UserMapping : ClassMapping<User> 
{ 
    public UserMapping() 
    { 
     Table("User"); 
     Id(e => e.Id, t => t.Generator(new IdentityGeneratorDef())); 
     Property(e => e.Name, map => map.Length(50)); 
    } 
} 

public class GroupMapping : ClassMapping<Group> 
{ 
    public GroupMapping() 
    { 
     Table("Group"); 
     Id(e => e.Id, t => t.Generator(new IdentityGeneratorDef())); 
     Property(e => e.Name, map => map.Length(50)); 

     Set(x => x.Users, set => 
     { 
      set.Table("UserToGroup");    
      set.Key(key => key.Column("GroupId"); 
     }, 
     re => re.ManyToMany(m => m.Column("UserId"))); 
    } 
} 

Когда я удалить запись пользователя из таблицы UserToGroup должны быть удалены все записи с этот пользователь упомянул. Когда я удаляю запись группы, из таблицы UserToGroup следует удалить все записи с указанной группой;

Как именно мне нужно переписать мои сопоставления?

ответ

0

Это стандартное поведение NH для непереходной стороны стороны двунаправленной ассоциации. Неверная сторона (одна без set.Inverse (true)) применима для постоянных изменений в таблице соединений. Чтобы удалить объект с обратной стороны, вам нужно написать дополнительный код.

Чтобы удалить объект с непересекающейся стороны ассоциации «многие-ко-многим», это просто, просто вызовите session.Delete (entity) и NH удалит сущность и все соответствующие записи из таблицы соединений. Чтобы удалить объект из обратной стороны (один переведенный с Inverse (истина)) вам нужно пойти другим путем

var user = ... // user do delete 
// delete records from join table 
foreach (var group in user.Groups) 
{ 
    group.Users.Remove(user); 
} 
// delete entity 
session.Delete(user); 

аналогичный код, который я видел в форумах Hibernate в качестве ответа на тот же вопрос.

+0

> Чтобы удалить объект с обратной стороны, вам необходимо написать дополнительный код. Дополнительные средства больше отображений на стороне пользователя? –

+0

Я обновил свой ответ. – hival