Entity Framework中扩展实体导航属性后的属性修改持久化疑问
Entity Framework中扩展导航属性的修改持久化问题解答
咱们来逐个拆解你的两个疑问:
1. 对code和description字段的修改会应用到EF模型中,还是仅作用于对象c本身?
首先要明确核心逻辑:你通过dbContext.A.FirstOrDefault(x => x.code == "9999")获取的A实例,是被当前dbContext上下文跟踪的。
当你修改这个实例的code和description属性时,这些变化会被EF的上下文实时记录在内存模型里,但此时还不会同步到数据库——只有当你调用dbContext.SaveChanges()方法,这些修改才会被持久化到数据库中。
另外,虽然customExtProperty是你通过部分类给B扩展的导航属性(EF并没有配置这个关联关系),但这不影响A实例的跟踪状态:只要这个A实例是从当前上下文获取的,不管它被赋值给哪个对象的属性,对它的修改都会被上下文感知到。
简单总结:
- 未调用
SaveChanges():修改仅存在于当前上下文的内存模型(EF跟踪的实体)中,对象c的customExtProperty指向的就是这个被跟踪的实例,所以修改是同步作用于两者的; - 调用
SaveChanges():修改会被写入数据库,此时EF模型与数据库状态保持一致。
2. 若从另一个进程执行dbContext.A.FirstOrDefault(x => x.code == "9999"),能否获取到更新后的myCutomCode和myCustomDescription值?
答案是取决于当前进程是否把修改保存到了数据库:
- 如果当前进程没有调用
dbContext.SaveChanges(),修改只存在于当前进程的上下文内存中,另一个进程的独立上下文完全访问不到这些内存数据,查询到的还是数据库里的原始旧值; - 就算当前进程调用了
SaveChanges(),还要看是否有未提交的事务:如果修改被包裹在事务里且未提交,另一个进程同样看不到更新后的值;只有当事务提交(或无事务时SaveChanges()执行成功),修改真正写入数据库后,另一个进程的查询才能获取到更新后的属性值。
额外补充:不同进程的dbContext是完全独立的,各自维护自己的实体跟踪缓存,跨进程的实体状态不会自动同步,必须通过数据库作为中间媒介来传递变更。
内容的提问来源于stack exchange,提问作者Willy
相关产品推荐
相关产品推荐

