Csharp/C#教程:导航属性无法加载属性分享


导航属性无法加载属性

我的上下文如下:

public class ApplicationDbContext: IdentityDbContext { public ApplicationDbContext() : base("DefaultConnection") { this.Configuration.LazyLoadingEnabled = true; } //DbSet properties } 

所以,启用了延迟加载。

我有以下课程:

 public class Home { private ICollection _slides; [Key] [Required] public string Name { get; set; } [ForeignKey("Header")] public int? HeaderID { get; set; } //Navigation properties public ICollection Slides { get { return _slides ?? (_slides = new List()); } set { _slides = value; } } public Content Header { get; set; } } 

请注意,导航属性HeaderSlides都使用没有 virtual关键字。 据我所知,当我们不使用virtual关键字时 – 属性应该急切加载。

但是,当我从数据库获取我的Home实体时,我的导航属性都是null (但属性HeaderID具有值)。
即使我切换到this.Configuration.LazyLoadingEnabled = false; – 未加载的属性 – 它们仍为null

以下是我从db获取数据的方法(使用存储库模式):

 public static Home GetHomeComponent( this IRepositoryAsync repository) { var result = repository .Query() .Select() .First(); return result; } 

我用Include属性解决了我的问题:

 public static Home GetHomeComponent( this IRepositoryAsync repository) { var result = repository .Query() .Include(x => x.Header) .Include(x=>x.Slides) .Select() .First(); return result; } 

但是这对我来说不方便(因为我有太多的导航属性要加载)。

所以,我的问题是:
使用virtual关键字 – 但为什么我的导航属性没有急切加载?
或者我做错了什么? 有没有其他方法加载我的导航属性而不使用Include

如果你不使用virtual关键字,它只意味着一旦你尝试访问非虚拟属性,它就不会从数据库加载,但你会得到一个Null

这并不意味着您将立即填充实体的所有属性,在您的代码中填充Slides for EG,您必须使用.Include() – 这是急切加载,在您之前加载属性用过的 。

您可以创建一个通用函数,通过它获取的参数填充所需的属性(使用params),请参阅此处了解更多详细信息:

EntityFramework Eager加载所有导航属性

上述就是C#学习教程:导航属性无法加载属性分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1024981.html

(0)
上一篇 2022年1月8日
下一篇 2022年1月8日

精彩推荐