我有三个具有以下结构的表:
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>
这样的事情
答案 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
}