所以我有
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
对不起,恐怕不可能在关系配置中包含条件。但是,作为部分解决方案,我建议您将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);
更新:
navection属性用于表示表之间的关系,并提供一种导航两个实体类型之间关联的方法。在您的情况下,您正在Books
和Users
之间建立一对多关系,它之所以有效,是因为在表上定义了一个外键,该外键表示关系的多端(Books
)。当你在关系数据库中的两个表之间建立关系时,你不能在关系中添加你想要的限制,在实体框架中,当你声明navection属性时也会发生同样的情况。这样,如果您需要特定用户的已阅读书籍,则需要进行查询。