using (var context = SingletonBase<DataAccess>.Instance.CreateDbContext()) { context.Configuration.AutoDetectChangesEnabled = false; context.Configuration.LazyLoadingEnabled = false; var acStatus = activityStatus.FirstOrDefault(a => a.Code.Equals(statusCode, StringComparison.OrdinalIgnoreCase)); var harvest = new Harvest { ActivityStatusId = acStatus.Id, }; context.Activities.Add(harvest);//harvest.ActivityStatus并未赋值 //经调试Add之后此处harvest.ActivityStatus不为null //后经修改acStatus在另外一个context中查询,Add之后正常为null }
请教下为什么会出现这种情况?
context.Configuration.AutoDetectChangesEnabled = false; context.Configuration.LazyLoadingEnabled = false;
去掉这两句就好了
AutoDetectChangesEnabled:获取或设置一个值,该值指示是否通过 DbContext 和相关类的方法自动调用 DetectChanges() 方法。 默认值为 true。
LazyLoadingEnabled:获取或设置一个值,该值指示是否启用针对公开为导航属性的关系的延迟加载。 延迟加载在默认情况下处于启用状态。
但是上面我都设置为false的,求指导!
如果 context.Configuration.AutoDetectChangesEnabled = true; , context.Activities.Add(harvest); 之后,EF会跟踪harvest的变化,如果harvest的属性值发生变化,在Commit时会进行数据库更新操作。
但是context.Configuration.AutoDetectChangesEnabled=false的啊
而且如你所说 ,我是不是可以理解为 ,AutoDetectChangesEnabled=true 时,Add(harvest)之后harvest.ActivityStatus!=null
同时谢谢你的解答。
@yy_yang: ActivityStatus的类型是什么?
@dudu:
Harvest : Activity
Activity{public byte ActivityStatusId ;public virtual ActivityStatus ActivityStatus ;}
@yy_yang: 是枚举类型?
@dudu: 不是 ,就是一个类
@yy_yang: 你把virtual去掉试试
@dudu:
public class Activity { public byte ActivityStatusId; public virtual ActivityStatus ActivityStatus; } public class Harvest : Activity { } public class ActivityStatus { }
是这么一个结构, 不好意思上面没说清楚