【发布时间】:2017-03-24 11:45:23
【问题描述】:
我有 2 个这样的课程:
父.cs
public class Parent
{
public int Id {get;set;}
public virtual ICollection<Child> Children { get; set; }
}
Child.cs
public class Child
{
public int Id {get;set;}
public ItemStatusType ItemStatusTyp { get; set; }
public int ParentId {get;set;}
[ForeignKey("ParentId")]
public virtual Parent Parent { 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)
;
}
}
运行时异常:
表达式 'c => c.Children.Where(p => (Convert(p.ItemStatusTyp) != 3)).ToList()' 不是有效的属性表达式。表达方式 应该代表一个属性: C#: 't => t.MyProperty' VB.Net: '函数(t)t.MyProperty'。
我必须在表达式后使用ToList,否则无法编译。
什么是我想做的正确的事?
提前致谢,
【问题讨论】:
-
你不能那样做。想象一下它在数据库中的样子,基本上就是配置设置的内容。
-
EF 在这种对开发者友好的糖果中一直是贫瘠的。 NHibernate 功能丰富得多,如果不是因为 EF 出色的 LINQ 支持,我几乎会切换。所以不,您不能使用条件配置导航属性。您可能需要求助于提供全局过滤器的第三方库或找到更复杂的方法来实现软删除。
标签: c# linq entity-framework-6 linq-to-entities