C#EntityFramework 6.0-如何在EntityTypeConfiguration中使用Where语句?
我有两门课是这样的: Parent.csC#EntityFramework 6.0-如何在EntityTypeConfiguration中使用Where语句?,c#,linq,entity-framework-6,linq-to-entities,C#,Linq,Entity Framework 6,Linq To Entities,我有两门课是这样的: Parent.cs public class Parent { public int Id {get;set;} public virtual ICollection<Child> Children { get; set; } } ItemStatusType.cs public enum ItemStatusType { Active = 1, Deactive = 2, Deleted =
public class Parent
{
public int Id {get;set;}
public virtual ICollection<Child> Children { get; set; }
}
ItemStatusType.cs
public enum ItemStatusType
{
Active = 1,
Deactive = 2,
Deleted = 3
}
我想要的是以某种方式检索始终活动的,而不是删除的。因为我没有实际删除记录,所以我只是将ItemStatusType
更新为Deleted
状态
因此,当我说ParentObj.Children
时,我只希望检索活动的孩子,而不进一步使用Where
条件
以下是我迄今为止所做的工作,但在运行时给出了一个例外情况,我在之后声明:
public class ParentConfiguration : EntityTypeConfiguration<Parent>
{
public ParentConfiguration()
{
HasMany(c => c.Children.Where(p => p.ItemStatusTyp != ItemStatusType.Deleted).ToList())
.WithRequired(c => c.Parent)
.HasForeignKey(c => c.ParentId)
;
}
}
公共类ParentConfiguration:EntityTypeConfiguration
{
公共父配置()
{
HasMany(c=>c.Children.Where(p=>p.ItemStatusTyp!=ItemStatusType.Deleted).ToList())
.WithRequired(c=>c.Parent)
.HasForeignKey(c=>c.ParentId)
;
}
}
运行时异常:
表达式'c=>c.Children.Where(p=>(Convert(p.ItemStatusTyp)
!=3)).ToList()不是有效的属性表达式。表情
应表示一个属性:C#::“t=>t.MyProperty”VB.Net:
“函数(t)t.MyProperty”
我必须在表达式之后使用ToList
,否则它无法编译
做我想做的事的正确方法是什么
提前感谢,您不能在fluent属性映射中使用
Where
或任何其他逻辑-这只是配置
基本上,您不能用声明的方式解决您需要的问题
有一些变通方法可以用于第一级实体,比如实现自己的扩展名MySet
,它将返回.Set.Where(x=>x.ItemStatusType!=ItemStatusType.Deleted)
并在任何地方使用,但这并不能解决子集合的筛选问题
您可以努力准备一组单独的实体用于选择数据,这些实体基本上应该基于数据库视图或存储过程;您必须为每个实体创建单独的视图,以便能够在基于这些视图的任何关系中组合选择实体
对于插入,您需要在“真实”表上映射实体。不确定它是否值得,但在某些情况下可能值得。你不可能做到这一点。想象一下,在数据库中会是什么样子,这基本上就是配置所设置的。EF在这样的开发人员友好型糖果中一直是贫瘠的。NHibernate的功能更加丰富,如果没有EF卓越的LINQ支持,我几乎要换掉它了。因此,不能使用条件配置导航属性。您可能想求助于提供全局筛选器的第三方库,或者寻找更复杂的方法来实现软删除。这太可惜了。。非常感谢。我会立即尝试你的建议。在尝试了几件事情之后,我按照你说的实现了,并且工作得很好。非常感谢。
public class ParentConfiguration : EntityTypeConfiguration<Parent>
{
public ParentConfiguration()
{
HasMany(c => c.Children.Where(p => p.ItemStatusTyp != ItemStatusType.Deleted).ToList())
.WithRequired(c => c.Parent)
.HasForeignKey(c => c.ParentId)
;
}
}