基于 Entity Framework 中多个键(条件)的一对多关系

One-to-many relation based on multiple key (conditional) in Entity Framework

所以我有

class User
{
   ...
   public virtual ICollection<Book> AlreadyRead {get; set;} 
}

class Book
{
   ...
   public virtual User Owner {get; set;}
   public bool AlreadyRead {get; set;}
}

所以我需要的是 User.AlreadyRead return 我 Books 通过这个 User,其中 AlreadyRead == true

我试过这个绑定

modelBuilder.Entity<Book>()
            .HasRequired(b => b.Owner)
            .WithMany(u => u.AlreadyRead)

但是这样 User.AlreadyRead return 所有的书,但我只需要 AlreadyRead == true;

的书

是否可以使用映射解决此问题,但不能使用 Where 逻辑附加 属性?

我只需要能够向将检查 AlreadyRead == true

的映射添加条件

抱歉,恐怕无法在关系配置中包含条件。但是,作为部分解决方案,我建议您在 User class 中添加 NotMapped 属性。您的模型将是这样的:

public class User
{
   ...
   public virtual ICollection<Book>  Books{get; set;} 

  [NotMapped] 
  public IEnumerable<Book> AlreadyReadedBooks 
  { 
     get 
     { 
        return Books.Where(b=>b.AlreadyRead); 
     } 
  }
}

public class Book
{
  ...
  public virtual User Owner {get; set;}
  public bool AlreadyRead {get; set;}
}

你的关系配置是这样的:

modelBuilder.Entity<Book>()
        .HasRequired(b => b.Owner)
        .WithMany(u => u.Books);

更新:

导航属性用于表示 table 之间的关系,并提供一种导航两种实体类型之间关联的方法。在你的例子中,你在 BooksUsers 之间建立了一对多的关系,它起作用是因为在 table 上定义了一个外键,它代表了关系 (Books)。当你在关系数据库中建立两个 table 之间的关系时,你不能在关系中添加你想要的限制,当你声明导航属性时,在 Entity Framework 中也会发生同样的情况。就是这样,如果你需要特定用户的阅读书籍,你需要做一个查询。