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