如何配置EntityFrameworkCore实体的WPF属性绑定解决无初始数据问题
WPF绑定EF Core导航属性无数据问题原因解答
结论
该问题由Entity Framework Core 与EF6的默认特性差异导致,和Fluent Api脚手架生成逻辑、XAML绑定本身的特性无关。
具体原因分析
- EF6默认开启懒加载功能,只要导航属性标记为
virtual,当业务代码或WPF绑定访问关联属性时,EF6会自动触发数据库查询加载关联实体,同时EF6默认启用的关系修复机制也会自动填充上下文缓存中已存在的关联实体。你之前绑定的Entity.AnotherEntityName本身不符合你定义的实体结构,本质是依赖AnotherEntity导航属性的快捷属性,在EF6下AnotherEntity被自动加载不为null,所以能正常取到值,属于依赖框架特性的巧合生效。 - EF Core 5默认未启用懒加载,仅将导航属性标记为
virtual不会触发自动加载,你执行DBContext.Entities.ToList()时只会加载Entity表本身的数据,关联的AnotherEntity导航属性默认是null,自然无法读取到对应的属性值。
两种解决方案的生效逻辑
- 显式加载
DBContext.AnotherEntities.ToList():所有AnotherEntity实例会被加载到DbContext的跟踪缓存中,EF Core的关系修复机制会自动将缓存中的关联实体填充到已加载的Entity的AnotherEntity导航属性上,绑定即可正常读取值。 - 绑定路径改为
Entity.AnotherEntity.AnotherEntityName:修正了不符合实体结构的绑定路径,若你同时配置了EF Core懒加载代理,直接访问AnotherEntity导航属性会触发懒加载查询关联数据,即可正常读取值。
更规范的优化方案
相比上述两种方案,更推荐使用急加载在查询主实体时直接加载需要的关联属性,避免多余的全局表查询,性能更稳定:
WPFPage() { _entities = DBContext.Entities .Include(e => e.AnotherEntity) .ToList(); }
内容的提问来源于stack exchange,提问作者Ivan Silkin
相关产品推荐
相关产品推荐

