【问题标题】:Entityframeworkcore Include method doesnt working. Eager Loading Lazy Loading doesn't working correctlyEntityframeworkcore Include 方法不起作用。急切加载延迟加载无法正常工作
【发布时间】:2021-04-18 16:21:44
【问题描述】:

当我使用 Include () 方法时,关系表不会添加到站(列表)中。急切加载和延迟加载都不起作用。关联的站列表始终为零。我使用的是 aspnet core mvc 5.0。缺少任何图书馆吗?它从数据库中提取数据,但不获取任何相关数据。

[HttpGet]
    public IActionResult Index(int? SayfaNo)
    {
        int _sayfaNo = SayfaNo ?? 1;

        // Proplem is here. Networks.Stations.Count=0  always 
        var networks = _context.Networks.Include(x=>x.Stations).ToList();
            //.ToPagedList<Network>(_sayfaNo, 9);
        if (networks == null)
        {
            return View(networks);
        }
        var request = Request;
        if (request.Headers!=null)
        {
            if (request.Headers["X-Requested-With"] == "XMLHttpRequest")
            {
                return PartialView("~/Views/Home/_BicycleListPartialView.cshtml", networks);
            }
        }
        return View(networks);

    }

public class Network:BaseEntity
{
    public Network()
    {
        Stations = new HashSet<Station>();
    }
    public string NId { get; set; }
    public string Name { get; set; }
    [ForeignKey("Location")]
    public int LocationId { get; set; }
    public virtual  Location Location { get; set; }
    public virtual ICollection<Station> Stations { get; set; }
}
public class Location:BaseEntity
{
    public string Country { get; set; }
    public string City { get; set; }
    public virtual Network Network { get; set; }

}
public class Station:BaseEntity
{
    public string SId { get; set; }
    public string Name { get; set; }
    public int? FreeBikes { get; set; }
    public int? EmptySlots { get; set; }
    [ForeignKey("Network")]
    public int NetworkId { get; set; }

    public virtual Network Network { get; set; }
}
public class BaseEntity
{
    [Key]
    public int Id { get; set; }
}

【问题讨论】:

  • 很高兴帮助他人编写代码!请添加简要说明您的代码如何解决最初的问题。谢谢!

标签: entity-framework lazy-evaluation eager-loading empty-list


【解决方案1】:

我发现了几个问题:

[ForeignKey] 属性可以放在导航属性或 FK 字段上,但是该属性必须指向 other 属性。 IE。如果你把它放在 FK 字段上,它应该指向导航属性:

[ForeignKey("Network")]
public int NetworkId { get; set; }
public virtual Network Network { get; set; }

.. 或者这个:

public int NetworkId { get; set; }
[ForeignKey("NetworkId")]
public virtual Network Network { get; set; }

在 Location 和 Network 之间声明的一对一关系似乎也存在冲突,其中 Network 应该有一个 Location,而 Location 有一个 Network。默认情况下,一对一关系期望加入两个表的 PK。如果这是一个多对一的关系(网络有一个位置,位置可以是许多网络的一部分,但可以有一个“默认”网络),那么位置将需要网络的 FK。 (即 DefaultNetworkId)以及网络和位置之间的关系需要明确配置。相反,如果多对一关系从位置到网络,则相同。相反,如果它是一对一的关系,那么我相信 EF Core 可以配置 1 对 1 /w 配对的 FK,否则它会期望它们的 ID 匹配。无论哪种方式,都可能需要对关系进行一些明确的配置。

接下来我会避免在构造函数中初始化引用导航属性。初始化 child 对象或集合是可以的,但要避免初始化引用:

public Network()
{
    // Location = new Location(); <- don't initialize as a *new* one is not a valid state.
    Stations = new HashSet<Station>();
}

【讨论】:

  • 感谢您的回复。我更新了我的消息。我正确地构建了关系。 Entityframeworkcore.Proxies 以前安装在我的项目中。 UseLazyLoadingProxies() 之前添加在服务部分。我打开了一个新项目,在那里尝试时延迟加载正在工作。有时Visual Studio中可能会出现错误。我解决了我的问题。我尝试了 2 件事并已修复,但我不知道是哪一个修复了它
  • 更新了vistudio 2019,重建项目。但是有一点,为什么不建议这种参考生成方法。-Location = new Location()。由于我使用aspcore mvc结构,所以我使用这个参考方法是为了不检查前端的Null。另外,当我在后端向我的网络模型添加记录时,我可以直接从导航功能输入记录,而无需创建新对象,这让我写更少的代码。从此处的引用创建对象时性能损失?或者,如果您有其他知道的,如果您发布,我将不胜感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
相关资源
最近更新 更多