我想限制导航属性返回模型。例如,我正在使用它AuditInfo记录模型的活动。删除模型后DeletedBy,Deleted将设置和属性。然而,这些模型仍将填充其他模型引用的导航属性,因为它们从未真正从数据库中删除任何内容。$ a/ I6 v. p' }4 Q AuditInfo类 ! M- ^! Z$ P. L# j3 n2 y( {- }public class AuditInfo{ [Key] public int AuditInfoID { get; set; Other attributes public string DeletedBy { get; set; public DateTime? Deleted { get; set; }}导航属性类& ?' }' V0 j* c& m
public class BlogPost{ Other attributes Only return Comment where Comment.AuditInfo.Deleted is NULL public virtual IList Comments { get; set; }}正在审核的课程 ; s# t# F$ c9 n( a; A6 Jpublic class Comment{ Other attributes public int AuditInfoID { get; set; }}我将如何设置约束?BlogPost.Comments未删除的注释(Comment.AuditInfo.Deleted为NULL)?7 L' B$ B: ?& X3 i# t# e
; Q4 G) V8 _, }/ e% n0 ?3 X解决方案: / J$ p6 v5 A3 Q4 o! g% x
(由于该[Key]属性,我假设你用的是EF Code-First 。). p `* a4 ?% B M0 L1 X9 `
加载导航属性和相关实体的方法有很多种,你可以用过滤器代替一些方法,但不能用过滤器代替所有方法:- P/ a( B" `0 ] f 延迟加载:您的导航属性必须是virtual这样可以完全延迟加载: : z7 e$ j. h6 X: O. r public virtual IList Comments { get; set; }加载父项: 5 r* B# b/ o* u5 Q# r var blogPost = context.BlogPosts.Find(1);foreach (var comment in blogPost.Comments) // lazy loading triggered here{}您不能在这里使用过滤器。延迟加载将始终加载给定博客文章的 所有 评论。: U2 o' r/ i1 R' S T( k 渴望加载:var blogPost = context.BlogPosts.Include(b => b.Comments).SingleOrDefault(b => b.Id == 1);你不能在过滤器中使用过滤器Include。渴望加载将永远加载到博客文章 所有 评论。 " D/ k* q1 w9 `- w7 g' X" z6 |: j显式加载:加载父项: x% _" P' h' {) L
var blogPost = context.BlogPosts.Find(1);您现在可以在加载评论时使用过滤器: s. D+ I* `7 W7 ?: m) Z
context.Entry(blogPost).Collection(b => b.Comments).Query() .Where(c => !c.AuditInfo.Deleted.HasValue) .Load();投影:过滤器可用于投影属性:2 O/ a; ?& y: s1 G: n: z3 T
var blogPost = context.BlogPosts .Where(b => b.Id == 1) .Select(b => new BlogPost = b, Comments = b.Comments.Where(c => !c.AuditInfo.Deleted.HasValue) .SingleOrDefault();某种全球过滤器策略不能应用于模型定义,使过滤器自动应用于上述 所有 % y! X# y) E. `4 b' H该方法不需要在显式加载和投影示例中明确指定。(我想你会想到这样的全球模型定义,但这是不可能的。