Why are collection navigation properties not initialized for lazy loading proxy classes
在我的一个项目中,我在实体上使用带有虚拟导航属性的实体框架。这意味着实体是从数据库加载的,或者是用
我的假设是,dynamicProxy负责初始化虚拟
然后,我尝试将所有属性都设置为
请参见以下示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data.Entity; static class Program { static void Main() { using (var db = new BloggingContext()) { var changeTrackingBlog = db.ChangeTrackingBlogs .Create(); // returns a DynamicProxy var changeTrackingBlogPostCount = changeTrackingBlog .Posts .Count; // Posts has type EntityCollection<Post> var lazyLoadingBlog = db.LazyLoadingBlogs .Create(); // returns a DynamicProxy var lazyLoadingBlogPostCount = lazyLoadingBlog.Posts .Count; // Posts == null } } } public class BloggingContext : DbContext { public IDbSet<Post> Posts { get; set; } public IDbSet<ChangeTrackingBlog> ChangeTrackingBlogs { get; set; } public IDbSet<LazyLoadingBlog> LazyLoadingBlogs { get; set; } } public class Post { [Key] public int PostId { get; set; } public virtual ChangeTrackingBlog ChangeTrackingBlog { get; set; } public virtual LazyLoadingBlog LazyLoadingBlog { get; set; } } public class ChangeTrackingBlog { [Key] public virtual int BlogId { get; set; } public virtual ICollection<Post> Posts { get; set; } } public class LazyLoadingBlog { // Not all properties are virtual, so no Change tracking, just lazy loading [Key] public int BlogId { get; set; } public virtual ICollection<Post> Posts { get; set; } } |
我希望有人能解释一下这里发生了什么。
型
避免空引用的常用方法是在构造函数中初始化集合:
1 2 3 4 |
我认为最好使用一个支持字段——这与在某些情况下不被调用的匿名构造函数有关(序列化或其他——为含糊不清道歉)。所以我这样做:
1 2 3 4 5 6 7 8 9 10 11 | public class LazyLoadingBlog { private ICollection<Post> _Posts = new List<Post>(); public virtual ICollection<Post> Posts { get { return _Posts ; } //protected set lets EF override for lazy loading protected set { _Posts = value; } } |
号
很遗憾,我无法解释为什么当您将所有属性标记为"虚拟"时,不会出现错误…