【发布时间】:2011-07-28 02:24:00
【问题描述】:
我试图在我的服务层中返回一个父对象,该父对象包含一组我需要过滤的子对象。仅过滤子对象,因此即使过滤器表示 0 个子对象,仍会返回父对象。
从下面的代码中可以看出,我在这里尝试使用的方法非常简单。我研究了其他看似相似但尚未得到答案的 SO 问题。
- 我不要求在数据库查询中出现过滤器,但如果可能的话,那也没关系。
- 如果使用单个 LINQ 语句,则过滤所有子对象仍应返回父对象(项目)。
我知道这可以通过在 Mapping 中添加 WHERE 子句来解决,但这确实可以让您级联删除。
使用下面的代码时会抛出以下异常:
拥有的实体实例不再引用具有 cascade="all-delete-orphan" 的集合:Project.Properties
// 实体
public class Project
{
public virtual int Id { get; set; }
private ICollection<Property> properties = new List<Property>();
public virtual ICollection<Property> Properties
{
get { return properties; }
set { properties = value; }
}
}
public class Property
{
public virtual DateTime? DateDeleted { get; set; }
}
//流畅的NHibernate映射
mapping.HasMany<Property>(x => x.Properties)
.ForeignKeyConstraintName("Project_Id")
.AsSet()
.Cascade.AllDeleteOrphan()
.OrderBy("Estate_Id");
// 服务层:调用项目存储库。仅返回具有活动属性的项目
private ProjectDto GetActiveProject(int id)
{
var p = projectRepository.Get(id);
//filter out deleted properties
if (p != null)
p.Properties = p.Properties.Where(x => x.DateDeleted == null).ToList();
return projectTransformer.Transform(p);
}
【问题讨论】:
标签: c# linq nhibernate