实体框架对导航属性的约束

2023-12-21

我想限制导航属性返回的模型。例如,我正在使用AuditInfo模型来记录模型的活动。一旦模型被删除DeletedBy and Deleted属性已设置。然而,由于数据库中没有真正“删除”任何内容,因此这些模型仍将填充在其他模型引用的导航属性中。

审计信息类

public class AuditInfo
{
    [Key]
    public int AuditInfoID { get; set; }

    //Other attributes

    public string DeletedBy { get; set; }

    public DateTime? Deleted { get; set; }
}

具有导航属性的类

public class BlogPost
{
    //Other attributes

    //Only return Comment where Comment.AuditInfo.Deleted is NULL
    public virtual IList<Comment> Comments { get; set; }
}

正在审核的类

public class Comment
{
    //Other attributes

    public int AuditInfoID { get; set; }
}

我如何设置一个约束,以便仅来自 BlogPost.Comments 的未删除评论(Comment.AuditInfo.Deleted 为 NULL)?


(我假设您使用的是 EF Code-First,因为[Key]属性。)

加载导航属性和相关实体的方法有多种,您可以对其中一些方法应用过滤器,但不能对所有方法应用过滤器:

  • 延迟加载:

    您的导航属性必须是virtual这样延迟加载就可以工作了:

    public virtual IList<Comment> Comments { get; set; }
    

    加载父级:

    var blogPost = context.BlogPosts.Find(1);
    foreach (var comment in blogPost.Comments) // lazy loading triggered here
    {
    }
    

    您无法在此处应用过滤器。延迟加载总会加载all给定博客文章的评论。

  • 急切加载:

    var blogPost = context.BlogPosts.Include(b => b.Comments)
        .SingleOrDefault(b => b.Id == 1);
    

    您无法应用过滤器Include。预加载将始终加载all给定博客文章的评论。

  • 显式加载:

    加载父级:

    var blogPost = context.BlogPosts.Find(1);
    

    您现在可以在加载评论时应用过滤器:

    context.Entry(blogPost).Collection(b => b.Comments).Query()
        .Where(c => !c.AuditInfo.Deleted.HasValue)
        .Load();
    
  • 投影:

    您可以在投影属性中应用过滤器:

    var blogPost = context.BlogPosts
        .Where(b => b.Id == 1)
        .Select(b => new
        {
            BlogPost = b,
            Comments = b.Comments.Where(c => !c.AuditInfo.Deleted.HasValue)
        })
        .SingleOrDefault();
    

不可能在模型定义中应用某种全局过滤策略,以便应用此过滤器all自动执行上述方法,无需在显式加载和投影示例中显式指定。 (我认为您心中有这样一个全局模型定义,但这是不可能的。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架对导航属性的约束 的相关文章

  • 更改表添加列并在同一条件 IF 语句中更新新列

    我正在尝试添加列并在同一 if 语句中更新它 BEGIN TRAN IF NOT EXISTS SELECT 1 FROM sys columns WHERE Name N Code AND Object ID Object ID N Te
  • 计算2个日期之间每个日期的记录数

    我必须创建一个查询来返回多轴图表的结果 我需要计算为 2 个日期之间的每个日期创建的 ID 数量 我试过这个 DECLARE StartDate datetime2 7 11 1 2020 EndDate datetime2 7 2 22
  • SQL Server 中离线索引重建和在线索引重建有什么区别?

    重建索引时 有一个选项ONLINE OFF and ONLINE ON 我知道当ONLINE模式打开时 它会复制索引 切换新查询以利用它 然后重建原始索引 使用版本控制跟踪两者的更改 如果我错了 请纠正我 但是 SQL 在离线模式下会做什么
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 将 SQL Server 2008 DB 迁移到 Postgres [重复]

    这个问题在这里已经有答案了 我想将 SQL Server 2008 数据库迁移到 Postgres 有没有一种无痛的方法来做到这一点 是否有任何工具可以扫描架构和存储过程以标记兼容性问题 无痛http dbconvert com conve
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • DataTable.GetChanges() 不断返回 NULL

    我正在尝试获取存在于的所有行allData但不在removeData public static DataTable RemoveDuplicateRows DataTable allData DataTable removeData re
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 需要在 SQL Server 中透视字符串值

    我有一个包含值的表 描述为 Occupation String Name String Developer A Developer B Designer X Coder Y Coder Z 我需要数据透视格式的值 Designer Deve
  • 总和和不同不会改变结果?

    我是一个新手 试图在这里解决这个问题 到目前为止还没有运气 非常感谢任何帮助 Select Distinct AB agency no ab branch no AS AGENCY BRANCH count AB agency no ab

随机推荐

  • 我无法获得正确的 StoreContext

    我已将我的应用程序提交到 Windows 应用商店并通过了认证 根据测试说明 https learn microsoft com en us windows uwp monetize in app purchases and Trials
  • 如何配置简单注入器 IoC 以使用 RavenDB

    我在用着简易注射器 http simpleinjector codeplex com用于 MVC 3 Web 应用程序中的 IOC 我在用RavenDB http ravendb net用于数据存储 在 mvc 3 应用程序中使用 Rave
  • Spyder 中的简单 Python 多重处理函数不输出结果

    我在这里有一个非常简单的函数 我试图在其中运行和测试 但是 它不会输出任何内容 也没有任何错误 我多次检查了代码 但没有任何错误 我打印了作业 这就是我得到的
  • 阻止对 Redis 密钥的访问 (ServiceStack)

    我正在尝试使用 ServiceStack Redis 客户端来实现我认为非常常见的缓存场景 但我很难找到一个很好的例子 在 ASP NET MVC 应用程序中 我们对外部 Web 服务进行相对长时间运行 且按计量 的调用 并将结果缓存一段时
  • 函数调用中的多个括号

    我对这个 Scala 表示法有点困惑 List 1 2 3 foldLeft 0 x acc gt acc x 0 和函数都是foldLeft的参数 为什么它们被传递到两个相邻的括号组中 我认为这是可行的 List 1 2 3 foldLe
  • XNA 与 DirectX 的比较 (C#)

    在PC开发方面 不包括Xbox和Zune XNA 和 C DirectX 有什么区别 C DirectX 是否比 XNA 具有显着优势 在速度 版税等方面 与非托管 C DirectX 相比 两者的速度如何 游戏编程行业正在走向何方 如果您
  • if 语句之外的变量访问

    我正在尝试访问 java 中 if 语句之外的变量 变量是axeMinDmg 这是我所拥有的 但出现错误 我想minDmg axeMinDmg thanks SuppressWarnings unused public static voi
  • 我应该使用哪种算法进行信号(声音)一类分类?

    Update我总结了问题及其答案here https jaderdias github io posts signal one class classification 我的目标是检测噪声信号中给定模式的存在 我想检测一种用麦克风记录声音的
  • 无论 Zsh 中的上下文如何,都将密钥绑定到完整的文件名

    有时我想要一个文件名 而不是 zsh 为我猜测的文件名 例如 我有一个 PNG 文件 没有正确的 png后缀 这会让 zsh 认为它不是图片 并且在我输入时不会列出它Tab完成论证display 我想知道是否有一个关键序列可以在上下文所在的
  • 如何在WebFilter的实现中获取路径变量? (服务器网络交换)

    我在 Spring Reactive 应用程序中工作 我知道如何使用 HttpServletRequest 在拦截器中获取 PathVariable 有些类似 request getAttribute HandlerMapping URI
  • 如何使 LWP::UserAgent 看起来像另一个浏览器?

    这是我关于 SO 的第一篇文章 所以要温柔 我什至不确定这是否属于这里 但就在这里 我想访问我的一个个人帐户上的一些信息 该网站写得不好 需要我手动输入我想要的信息的日期 这确实是一种痛苦 我一直在寻找一个学习更多 Perl 的借口 所以我
  • 带有参数的量角器“addMockModule()”在 Firefox 中无法正确处理结构化数据

    我最近阅读了有关这些量角器问题的解决方案 无法轻松地将上下文传递给addMockModule 695 https github com angular protractor issues 695 feat addMockModule 添加第
  • Angular ng-click 不适用于 $compile

    我有类似于下面的代码来触发clickAngular 应用程序中的事件 为什么事件没有触发 var app angular module myApp app directive myTop function compile return re
  • Scala问题可选构造函数

    想象一下这段简单的代码 class Constructor var string String def this s String this string s def testMethod println string testMethod
  • 如何在xamarin中浏览sqlite数据?

    我的应用程序中有一个列表视图 一些数据在填充列表视图之前保存到数据库中 我的问题是看不到数据 以及如何验证数据是否存储在数据库中 我给出了 Visual Studio 2015 的解决方案 适用于 Xamarin 找到上图中提到的数据库文件
  • Twitter4j:调用 getFollowersIDs 时出现不一致的身份验证错误

    我正在使用 Twitter4j 版本 3 0 3 我正在尝试提取关注者 ID 并使用 OAuth 我已经使用 Twitter4j 多年 并且对该框架比较有经验 然而 奇怪的事情发生了 我的程序将运行良好 然后间歇性地抛出以下堆栈跟踪 Exc
  • 如何从照片自定义相册中获取图像,iOS SDK?

    I m working on an iOS app in which I need gallery view like Instagram I have added gallery View camera View and video Vi
  • 使用命令行参数运行 webpack

    我一直在尝试将 args 从命令行传递到 webpack 插件 我可以通过 process argv 访问参数 但之后 wwebpack 失败并出现错误 未找到条目模块中的错误 错误 无法解析模块 看来 webpack 将 args 视为它
  • 滑动窗口操作的 Numpy 矢量化

    我有以下 numpy 数组 arr 1 1 2 3 4 5 6 3 X 2 arr 2 0 5 0 6 0 7 0 8 0 9 1 0 1 1 1 2 1 3 1 4 5 X 2 arr 1显然是一个3 X 2数组 而arr 2 is a
  • 实体框架对导航属性的约束

    我想限制导航属性返回的模型 例如 我正在使用AuditInfo模型来记录模型的活动 一旦模型被删除DeletedBy and Deleted属性已设置 然而 由于数据库中没有真正 删除 任何内容 因此这些模型仍将填充在其他模型引用的导航属性