如何让Entity Framework返回带有某些默认值的相关对象?

时间:2011-08-03 19:34:52

标签: entity-framework

说我有项目和任务EF代码第一类

public class Project
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Task> Tasks { get; set; }
    }

    public class Task
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int ProjectId { get; set; }
        public bool IsDeleted {get; set;}
        public virtual Project Project { get; set; }
    }

说我有

public void SomeAction()
{
Project p= repository.GetById(1);
var tasks = p.Tasks;
//var tasks = p.Tasks.Where(t=>t.IsDeleted==false);
}

我希望Project类上的我的Tasks属性将始终在IsDeleted上执行该过滤器并返回该子集...以避免必须在整个地方写入该条件...

有什么建议吗?

编辑:

我正在使用EF Code First

3 个答案:

答案 0 :(得分:6)

在OnModelCreating方法

中为模型添加一个鉴别器
modelBuilder.Entity<TEntity>().Map(m => m.Requires("IsDeleted").HasValue(false));

<强>注意事项

  • 您无法再加载已删除的项目(除非您将IsDeleted true映射到另一个实体,否则您可能会失去自动过滤功能)
  • poco类不能具有IsDeleted属性(无法映射区分符号)
  • 因为无法映射IsDeleted,所以首先需要运行原始SQL来删除实体。

答案 1 :(得分:3)

EF Code first = NO WAY。只是EDMX中提供的一长串功能中的一个,它在代码中完全丢失。来自EDMX的映射条件可以做到这一点,但它仍然存在问题,因为它是硬编码的并且无法更改(=即使你想要除非你使用另一个EDMX,你也永远无法加载已删除的实体)。解决方案是在EF中实现全局过滤器,但EF没有类似的东西,尽管旧的Linq到实体至少有关系(DataLoadOptions.AssociateWith)。

在关系中,如果不将已删除的实体加载到应用程序中并且在应用程序的内存中进行过滤,则无法使用急切或延迟加载。

答案 2 :(得分:1)

在“模型设计器”中,选择“任务”实体,然后打开“映射详细信息”窗口。这应该显示您的实体映射到的数据库表以及所有列。就在“地图到[YourTable]”的位置,您应该会看到一个选项<Add a Condition>。这应该让你设置一个像你正在寻找的条件。