当前位置: 首页 > 编程语言 > C#

从DbContext中获取所有被跟踪的实体?分享

时间:2023-04-11 02:09:42 C#

从DbContext中获取所有被跟踪的实体?我数据库中的许多表都需要有一个“DateCreated”和“DateModified”列。我想在调用SaveChanges()时更新这些列。我所有的模型对象都继承自AbstractModel类以允许这种行为。该类如下所示:publicabstractclassAbstractModel{publicvirtualvoidUpdateDates(){}}然后,我计划在任何具有需要维护的DateCreated和DateModified字段的子类中覆盖UpdateDates()。要使用它,我需要能够获得DbContext正在跟踪的所有实体的列表,并在对象标记为已添加或已修改时调用UpdateDates()。我似乎无法访问DbContext存储此信息的任何地方。我可以使用dbContext.Entry(object).State获取单个实体的EntityState,但我不知道如何获取所有跟踪实体的列表。我应该怎么办?我想你可以使用ChangeTracker:publicclassMyContext:DbContext{//...}返回base.SaveChanges();此处接受的解决方案对于EF4比ObjectContext建议更好-我们遇到了一些问题,例如我们在测试上下文中使用的内存数据库与上述解决方案不兼容(在继承方案条目的分离状态中修改某些内容).该解决方案使用DbContext本机方式来检索被跟踪的实体:context.ChangeTracker.Entries().Where(t=>t.State==EntityState.Modified)这在我们的项目中运行良好,因此每次添加都具有我们都没有的标准'必须记住在LastUpdatedDateTime属性的新实体时覆盖一些东西。使用EF4;对于EF5DbContext,我认为((IObjectContextAdapter)_dbContext).ObjectContext.ObjectStateManager将获得对象状态管理器://在我们的SaveChanges包装器中:varentries=context.ObjectStateManager.GetObjectStateEntries(EntityState.Added|EntityState.Modified|EntityState.Deleted);privatestaticvoidPopulateDate(IEnumerableentries){foreach(varentryinentries){if(entry.State!=EntityState.Deleted){if((entry.Entity!=null)&&(entry.Entity.GetType().GetProperty("LastUpdatedDateTime")!=null)){((dynamic)entry.Entity).LastUpdatedDateTime=DateTime.UtcNow;}}}}反射调用不是问题:对于具有25个属性(很多)的对象,一百万个反射查询平均需要约210毫秒。以上就是C#学习教程:Getalltr??ackedentitiesfromDbContext?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: