【问题标题】:C# EntityFramework 6.0 - How to use Where Statement in EntityTypeConfiguration?C# EntityFramework 6.0 - 如何在 EntityTypeConfiguration 中使用 Where 语句?
【发布时间】: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


【解决方案1】:

您不能在流畅的属性映射中使用Where 或任何其他逻辑 - 这只是配置。

基本上你不能以声明的方式解决你所需要的。

您可以对一级实体使用一些变通方法,例如实现您自己的扩展 MySet&lt;T&gt;,它将返回 .Set&lt;T&gt;.Where(x =&gt; x.ItemStatusType != ItemStatusType.Deleted) 并在任何地方使用它,但这并不能解决子集合的过滤问题.

您可以努力准备一组单独的实体用于选择数据,这些实体基本上应该基于数据库视图或存储过程;您必须为每个实体创建单独的视图,因此您将能够基于这些视图实体在任何关系中组合选择。

为了插入,您需要将实体映射到“真实”表上。不确定是否值得,但在某些情况下可能会。

【讨论】:

  • 太可惜了..谢谢..我会马上试试你的建议。
  • 在尝试了更多的东西之后,我按照你说的实现了并且工作得很好。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2021-05-29
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多