为了账号安全,请及时绑定邮箱和手机立即绑定

查询列子集时的EF Core修复

查询列子集时的EF Core修复

C#
慕娘9325324 2021-04-10 14:11:04
从文档中:实体框架核心将自动将导航属性修复为先前已加载到上下文实例中的任何其他实体。因此,即使您没有显式包含导航属性的数据,但如果先前已加载某些或所有相关实体,也可能仍会填充该属性。实体设置:public class Page{    public Page () {        Event = new HashSet<Event>();    }    [Key]    public int Id { get; set; }    public string Title { get; set; }    public string Content { get; set; } // don't want to retrieve, too large    public ICollection<Event> Event { get; set; }}public class Event{    [Key]    public int Id { get; set; }    public string Name { get; set; }    public string Type { get; set; }    public Page Page { get; set; }}上下文是通过一对多关系设置的。这些是我运行的查询,一个接一个:var pages = _dbContext.Page.Select(page => new Page        {            Id = page.Id,            Title = page.Title        }).ToList();var events = _dbContent.Event.ToList();我希望每一个Page有Events收集填充(反之亦然为Event与Page基准),但修复过程不会发生(Page在Event是null,并且Event在Page为null)。如果我以此替换第一个查询,则修复工作:var pages = _dbContext.Page.ToList();因此,似乎没有进行修复的可能性。我之所以将其分为2个查询,是为了避免使用类似的方法Include,因为它们会产生巨大的联接并复制大量数据。有什么办法解决吗?我需要自己手动进行修复吗?
查看完整描述

2 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

我认为那不行。您是否已验证此行为在EntityFramework的早期版本中是否有效?因为,您没有提取完整的实体,而是仅提取其实体,然后将其传递到新实体中,所以实际上您只是在选择属性并创建一个新实体。


如果您希望附加此文件,则可以在选择页面后手动调用附加方法


var pages = _dbContext.Page.Select(page => new Page

    {

        Id = page.Id,

        Title = page.Title

    }).ToList();


pages.ForEach(p => _dbContext.Page.Attach(p));

请记住,如果在此之后调用SaveChanges,则将丢失已卸载的属性,因此仅在调用GetMethods时使用此属性。


查看完整回答
反对 回复 2021-04-24
  • 2 回答
  • 0 关注
  • 222 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信