您何时需要在实体框架中包括相关实体?

放置和

在我必须与实际.Include()相关的实体时,或者当我不需要时,这对我来说似乎是任意的在某些情况下,EF不提供相关实体的信息给我,而在其他情况下,EF无法对相关实体做任何事情,因为我没有包括它们:

不带.include()的作品;

这是我不使用.Include();加载数据的示例。

public class InvoiceService
{
    private ApplicationDbContext db { get; set; }
    public InvoiceService(ApplicationDbContext context)
    {
        db = context;
    }

    public Invoice Get(int id)
    {
        return db.Invoices.SingleOrDefault(x => x.Id == id);
    }
}

public partial class ShowInvoice : System.Web.UI.Page
{
    private InvoiceService invoiceService;

    private readonly ApplicationDbContext context = new ApplicationDbContext();
    protected void Page_Load(object sender, EventArgs e)
    {
        invoiceService = new InvoiceService(context);
        if (!IsPostBack)
        {
            int.TryParse(Request.QueryString["invoiceId"].ToString(), out int invoiceId);
            LoadInvoice(invoiceId);
        }
    }

    private void LoadInvoice(int invoiceId)
    {
        var invoice = invoiceService.Get(invoiceId);
        // Other code irrelevant to the question goes here.
    }
}

以下是结果,其中包括与我请求的发票相关的公司数据: 在此处输入图片说明

如您所见,该公司的信息肯定来自但未明确包含。

如果没有.include(),则无法使用;

相反,在同一项目中,我已经完成了一些与发票的映射,并且在获取相关实体的属性值时遇到了NullReferenceExceptions,因为我没有.Include()

此方法获取指定公司的所有批准的时间表条目。此视图模型仅在处理发票的时间表条目的关联时使用(因此,您根据选定的时间表条目进行发票)。

public List<InvoiceTimesheetViewModel> GetInvoiceTimesheetsByCompanyId(int companyId)
{
    var factory = new TimesheetViewModelsFactory();

    var timesheets = db.Timesheets.Where(x => x.Approved && x.Company.Id == companyId && !x.Deleted).ToList();
    return factory.GetInvoiceTimesheetsViewModel(timesheets);
}

NullReferenceExceptions发生在工厂中,该工厂将时间表实体映射到视图模型:

public List<InvoiceTimesheetViewModel> GetInvoiceTimesheetsViewModel(List<Timesheet> timesheets)
{
    var model = new List<InvoiceTimesheetViewModel>();
    foreach (var timesheet in timesheets)
    {
        var start = DateTime.Parse((timesheet.DateAdded + timesheet.StartTime).ToString());
        var finished = DateTime.Parse((timesheet.DateCompleted + timesheet.EndTime).ToString());
        DateTime.TryParse(timesheet.RelevantDate.ToString(), out DateTime relevant);

        model.Add(new InvoiceTimesheetViewModel
        {
            RelevantDate = relevant,
            BillableHours = timesheet.BillableHours,
            Finished = finished,
            Id = timesheet.Id,
            StaffMember = timesheet.StaffMember.UserName, // NRE here.
            Start = start,
            Task = timesheet.Task.Name // NRE here.
        });
    }
    return model;
}

为了解决这些问题,我不得不将获取数据的查询更改为以下内容:

var timesheets = db.Timesheets.Include(i => i.StaffMember).Include(i => i.Task)
            .Where(x => x.Approved && x.Company.Id == companyId && !x.Deleted).ToList();

为什么实体框架有时很乐意在没有我明确请求该数据的情况下为我提供数据,而有时却需要我明确地请求该数据,否则会引发错误?

我如何知道何时需要显式包含要查找的数据以及何时不包含查找的数据?

3615

实体框架使用延迟加载来加载子关系。为了使延迟加载工作,模型中的属性应使用virtual关键字标记Ef会覆盖它并添加延迟加载支持。

当您没有虚拟属性时,EF无法稍后再加载子关系数据,因此只有在这种情况下才可以这样做-在使用进行初始数据加载期间Include

public class Timesheet
{
    ...
    public virtual StaffMember StaffMember { get; set; }
    public virtual Task Task { get; set; }
    ...
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

实体框架核心:如何在其空列属性中包括与空相关的实体?

来自分类Dev

实体框架加载相关实体

来自分类Dev

在WebAPI OData请求中包括相关实体

来自分类Dev

实体框架包括绩效

来自分类Dev

包括第3层相关的集合,并通过代码优先实体框架在gridview中显示

来自分类Dev

在游戏框架中订购相关实体

来自分类Dev

实体框架查询单个查询中的相关实体

来自分类Dev

使用 Linq 在实体框架中查询嵌套/相关实体

来自分类Dev

如何在实体框架中按多个相关实体过滤

来自分类Dev

我是否需要在实体框架6中使用POCO类

来自分类Dev

实体框架5-使用“包括”应用与过滤器加载相关的实体

来自分类Dev

实体框架入口负载相关实体

来自分类Dev

实体框架-似乎无法加载相关实体

来自分类Dev

相关实体查询实体框架

来自分类Dev

实体框架核心相关数据

来自分类Dev

实体框架查询以包括实体集合的子实体

来自分类Dev

不要在实体框架中映射ReactiveUI属性

来自分类Dev

实体框架 - 添加具有相关实体的实体时出错

来自分类Dev

实体框架中的复杂类型是什么?何时使用?

来自分类Dev

需要在* .tt文件上将TextTemplatingFileGenerator设置为自定义工具,否则Visual Studio 2019不会构建您的实体框架模型

来自分类Dev

即使访问仅限于我的数据访问层,我也需要在UI中引用实体框架吗?

来自分类Dev

实体框架仅包括/选择不同表中的某些属性

来自分类Dev

实体框架:更新记录,包括在Net Core 3中

来自分类Dev

在实体框架中显式加载嵌套的相关模型

来自分类Dev

使用实体框架从数据库中删除相关对象

来自分类Dev

实体框架:在WPF中创建和更新相关对象

来自分类Dev

实体框架中的相关表显示为空

来自分类Dev

实体框架核心不包括何时ToListAsync,但与FirstOrDefaultAsync一起包含

来自分类Dev

需要 MVC 实体框架的帮助

Related 相关文章

  1. 1

    实体框架核心:如何在其空列属性中包括与空相关的实体?

  2. 2

    实体框架加载相关实体

  3. 3

    在WebAPI OData请求中包括相关实体

  4. 4

    实体框架包括绩效

  5. 5

    包括第3层相关的集合,并通过代码优先实体框架在gridview中显示

  6. 6

    在游戏框架中订购相关实体

  7. 7

    实体框架查询单个查询中的相关实体

  8. 8

    使用 Linq 在实体框架中查询嵌套/相关实体

  9. 9

    如何在实体框架中按多个相关实体过滤

  10. 10

    我是否需要在实体框架6中使用POCO类

  11. 11

    实体框架5-使用“包括”应用与过滤器加载相关的实体

  12. 12

    实体框架入口负载相关实体

  13. 13

    实体框架-似乎无法加载相关实体

  14. 14

    相关实体查询实体框架

  15. 15

    实体框架核心相关数据

  16. 16

    实体框架查询以包括实体集合的子实体

  17. 17

    不要在实体框架中映射ReactiveUI属性

  18. 18

    实体框架 - 添加具有相关实体的实体时出错

  19. 19

    实体框架中的复杂类型是什么?何时使用?

  20. 20

    需要在* .tt文件上将TextTemplatingFileGenerator设置为自定义工具,否则Visual Studio 2019不会构建您的实体框架模型

  21. 21

    即使访问仅限于我的数据访问层,我也需要在UI中引用实体框架吗?

  22. 22

    实体框架仅包括/选择不同表中的某些属性

  23. 23

    实体框架:更新记录,包括在Net Core 3中

  24. 24

    在实体框架中显式加载嵌套的相关模型

  25. 25

    使用实体框架从数据库中删除相关对象

  26. 26

    实体框架:在WPF中创建和更新相关对象

  27. 27

    实体框架中的相关表显示为空

  28. 28

    实体框架核心不包括何时ToListAsync,但与FirstOrDefaultAsync一起包含

  29. 29

    需要 MVC 实体框架的帮助

热门标签

归档