【问题标题】:Entity Framework: Exclude a navigation property实体框架:排除导航属性
【发布时间】:2016-01-03 13:18:34
【问题描述】:

我正在使用 Entity Framework 6,我想检索一个具有多个导航属性的实体。我不想检索其中一个,也没有找到实现此目的的方法。

这是我的模型:

全尺寸图片:http://i.imgur.com/KFdsTVU.jpg?1

我想检索 Session 实体的所有导航属性,但 Discussions 除外。 所以我做了:

        using (var context = new ModelContainer())
        {
            context.Database.Log = msg => Trace.WriteLine(msg);
            var session = await
                context.SessionSet.FirstOrDefaultAsync(a => a.Identifier == sessionIdentifier);
            var result = await Json(session).ExecuteAsync(new CancellationToken());
            return ResponseMessage(result);
        }

但我希望实体框架有一个排除实体字段的方法。

【问题讨论】:

  • 真的没有让你明白。默认情况下,EF 将排除这些导航属性。顺便说一句,你想做什么?
  • 只需Include() 您需要的那些,其余的您不会获取。如果您在循环引用方面遇到问题,请使用 DTO
  • @Rahul 我想选择我的会话实体,但它带有所有导航属性(包括我不想检索的讨论)。所以我想找到一种方法来排除导航属性。如果我执行 context.SessionSet.FirstOrDefaultAsync(...),我的请求将选择所有内容。
  • @bbougot Include 用于Eager Loading
  • 听起来您需要对不同类型的模型进行一些研究。您正在使用数据模型,但想要投影到 DTO,可能用作 ViewModel。此外,考虑使用 AutoMapper 来帮助在不同模型之间进行转换。它让生活更轻松。

标签: c# sql asp.net .net entity-framework


【解决方案1】:

我最终这样做了:

          var session = await
                context.SessionSet.Select(a => new
                {
                    Host = a.Host,
                    Identifier = a.Identifier,
                    Destination = a.Destination,
                    Positions = a.Positions,
                    Sentinelles = a.Sentinelles,
                    Id = a.Id,
                    Code = a.Code,
                    Notifications = a.Notifications,
                    Status = a.Status,
                    Transportation = a.Transportation
                }).FirstOrDefaultAsync(a => a.Identifier == sessionIdentifier);
            var result = await Json(session).ExecuteAsync(new CancellationToken());

【讨论】:

  • 这是对匿名 DTO 的投影。出于文档和互操作性目的,您可能需要提取具体类型并映射到该类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多