回答

收藏

实体框架限制导航属性

技术问答 技术问答 239 人阅读 | 0 人回复 | 2023-09-14

我想限制导航属性返回模型。例如,我正在使用它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该方法不需要在显式加载和投影示例中明确指定。(我想你会想到这样的全球模型定义,但这是不可能的。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则