NHibernate一对多删除相关记录

时间:2017-10-03 15:29:05

标签: c# nhibernate

我有三个具有以下结构的表:

Todo
    Id
    Name

User
    Id
    Name

TodoUser
    Id
    TodoId
    UserId
    Status

对于Todo.ResponsibleUsers,我创建了以下映射:

private IList<TodoUser> responsibleUsers = new List<TodoUser>();
[Bag(0, Name = "ResponsibleUsers", Cascade = CascadeStyle.AllDeleteOrphan, Table = "TodoUser", Inverse = true)]
[Key(1, Column = "TodoId")]
[OntToMany(2, ClassType = typeof(TodoUser))]
public virtual IList<TodoUser> ResponsibleUsers {
    get { return responsibleUser; }
    set { responsibleUsers = (IList<TodoUser>)value; }
}

属性ResponsibleUsers必须是IList<TodoUser>类型,还是属于List<TodoUser>类型? 我想做一些像todo.ResponsibleUsers.RemoveAll(itemsToRemove);

这样的IList<TodoUser>这样的事情

1 个答案:

答案 0 :(得分:1)

回答这个问题:

  

属性ResponsibleUsers的类型是IList<TodoUser>还是属于List<TodoUser>类型?

检查文档:

  

Chapter 6. Collection Mapping

     

6.1。持久收藏

     

NHibernate要求持久的集合值字段   声明为通用接口类型,例如:

public class Product
{
    private string serialNumber;
    private ISet<Part> parts = new HashSet<Part>();

    public ISet<Part> Parts
    {
        get { return parts; }
        set { parts = value; }
    }

    public string SerialNumber
    {
        get { return serialNumber; }
        set { serialNumber = value; }
    }
}
     

实际界面可能是   System.Collections.Generic.ICollection<T>,   System.Collections.Generic.IList<T>,   System.Collections.Generic.IDictionary<K, V>,   System.Collections.Generic.ISet<T>

所以,是的,我们必须使用接口。

解决问题
  

我想做todo.ResponsibleUsers.RemoveAll(itemsToRemove);

之类的事情

我们可以实现一些自定义扩展方法

public static class Ext
{
    public static void RemoveAll(this IList<T> list, IEnumerable<T> toRemove)
    {
        ... // remove items matching toRemove from the list
    }