【问题标题】:One-to-many relation based on multiple key (conditional) in Entity Framework实体框架中基于多个键(条件)的一对多关系
【发布时间】:2015-02-06 10:39:45
【问题描述】:

所以我有

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

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

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

我试过这个绑定

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

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

是否可以使用映射来解决这个问题,而不是使用Where 逻辑的附加属性?

我只需要能够将条件添加到将检查AlreadyRead == true的映射中

【问题讨论】:

  • 你能用UserClass里面的代码更新问题吗
  • 对不起,我的错。用户 == 人
  • 您尝试绑定的问题是什么?即您提供的模型构建器声明。
  • 除了 AlreadyRead 之外,User 和 Book 之间是否已经存在关系?
  • 不,存在单一关系。它返回所有书籍的问题,但我只需要阅读书籍

标签: .net sql-server entity-framework relational-database one-to-many


【解决方案1】:

抱歉,恐怕不可能在关系配置中包含条件。但是,作为部分解决方案,我建议您将 NotMapped 属性添加到您的 User 类。你的模型应该是这样的:

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);

更新:

导航属性用于表示表之间的关系,并提供一种方法来导航两种实体类型之间的关联。在您的情况下,您正在建立BooksUsers 之间的一对多关系,它之所以有效,是因为在表上定义了一个表示关系的多端(Books)的外键。当您在关系数据库中的两个表之间建立关系时,您无法在关系中添加您想要的限制,当您声明导航属性时,在实体框架中也会发生同样的情况。这样,如果你需要特定用户的已读书籍,你需要做一个查询。

【讨论】:

  • 好的,但我很想知道为什么不能这样做。我认为虚拟导航属性实际上以相同的方式工作,所以应该有一些真正的约束来不允许它?
  • 我不明白您所说的“虚拟导航属性实际上以相同的方式工作”是什么意思。我已经更新了我的答案。希望这可以帮助您更好地了解它们的工作原理
  • 是的,但是这个导航属性(代理列表)里面是什么 - 这是像 Books.Where(b => b.UserId == CURRENT_USER_ID) 这样的简单调用。所以我想不通,为什么不能指定额外的约束
  • 我理解你的观点,但这打破了导航属性的概念。这是(在这种情况下)访问 Book 表中当前用户所涉及的所有行。如果您限制了这一点,您就没有正确地代表用户和图书之间的关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 2013-11-24
  • 2015-01-11
  • 2017-01-28
  • 2011-12-17
相关资源
最近更新 更多