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

nac*_*10f 4 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; }
    }
Run Code Online (Sandbox Code Playgroud)

说我有

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

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

有什么建议?

编辑:

我正在使用EF Code First

Bet*_*tty 6

在OnModelCreating方法中为模型添加一个鉴别器

modelBuilder.Entity<TEntity>().Map(m => m.Requires("IsDeleted").HasValue(false));
Run Code Online (Sandbox Code Playgroud)

注意事项

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


Lad*_*nka 3

EF 代码优先 =没办法。这只是 EDMX 中可用的一长串功能中的一个,并且在代码中完全缺失。EDMX 的映射条件可以做到这一点,但它仍然存在问题,因为它是硬编码的并且无法更改(= 即使您愿意,您也永远无法加载已删除的实体,除非您使用另一个 EDMX)。解决方案是在 EF 中实现全局过滤器,但 EF 没有类似的东西,尽管旧的 Linq-to-entities 至少对于关系有它们 ( DataLoadOptions.AssociateWith)。

在无法使用急切或延迟加载而不将已删除实体加载到应用程序并在应用程序内存中进行过滤的关系中,这要痛苦得多。