紧接着我关于嘲笑DbContext的另一个问题.我还有另外一个关于模拟 EF Code First的问题.
我现在有一个更新的方法,如下所示:
if (entity == null)
throw new ArgumentNullException("entity");
Context.GetIDbSet<T>().Attach(entity);
Context.Entry(entity).State = EntityState.Modified;
Context.CommitChanges();
return entity;
Run Code Online (Sandbox Code Playgroud)
Context是我自己的DbContext的接口.
我遇到的问题是,我该如何处理
Context.Entry(entity).State.
我已经介绍了这段代码,当我有一个真实的DbContext作为我的Context接口的实现时,它就可以工作了.但是当我把假的上下文放在那里时,我不知道如何处理它.
DbEntityEntry类没有构造函数,所以我不能在我的伪上下文中创建一个新构造函数.
有没有人在CodeFirst解决方案中嘲弄或伪造DbEntityEntry有什么成功?
或者有更好的方法来处理状态变化吗?
我正在开发一个允许用户编辑实体列表的项目.我将这些实体映射到视图模型并使用编辑器字段显示它们.当用户按下提交按钮时,我会浏览每个模型并进行更新,如下所示:
foreach (var viewModel in viewModels)
{
//Find the database model and set the value and update
var entity = unit.EntityRepository.GetByID(fieldModel.ID);
entity.Value = viewModel.Value;
unit.EntityRepository.Update(entity);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码可以工作,但是你可以看到我们需要为每个实体命中两次数据库(一次检索,另一次更新).使用Entity Framework有更有效的方法吗?我注意到每个更新都会生成一个单独的SQL语句.循环结束后是否有提交所有更新的方法?
我有一个Project对象,它由许多嵌套对象组成。
将此对象保存到数据库:
var existingProject =
db.Project.Single(p => p.ID == changedProject.ID).Include(p => p.Something);
existingProject = Mapper.Map(changedProject, existingProject);
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
由于外键为空,这失败了,这并不奇怪,因为当我深入研究更改跟踪器时,我可以看到它非常混乱:
var added = db.ChangeTracker.Entries().Where(e => e.State == EntityState.Added);
Run Code Online (Sandbox Code Playgroud)
映射发生后,项目中的大量对象被标记为“已添加”(即使项目中没有添加或删除任何内容,我只更改了一个属性)。
这是因为 AutoMapper 创建嵌套对象的新实例,而 EF 无法将它们与数据库中的现有对象关联吗?
我在很多地方都看到了这种方法的建议,有没有一种方法可以让 AutoMapper 与 ChangeTracker 一起工作,以便它理解上述内容 - 或者最好手动映射所有内容?(就我而言,有很多工作)