相关疑难解决方法(0)

模拟或伪造DbEntityEntry或创建新的DbEntityEntry

紧接着我关于嘲笑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有什么成功?

或者有更好的方法来处理状态变化吗?

entity-framework ef-code-first

60
推荐指数
1
解决办法
2万
查看次数

更新实体列表的有效方法

我正在开发一个允许用户编辑实体列表的项目.我将这些实体映射到视图模型并使用编辑器字段显示它们.当用户按下提交按钮时,我会浏览每个模型并进行更新,如下所示:

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语句.循环结束后是否有提交所有更新的方法?

c# sql asp.net-mvc entity entity-framework

27
推荐指数
2
解决办法
4万
查看次数

AutoMapper 混淆了 ChangeTracker

我有一个Project对象,它由许多嵌套对象组成。

将此对象保存到数据库:

  • 我仅更改项目中的一个属性(作为测试),并将其传递给我的 DAL。
  • 我使用 EF 从数据库加载现有项目。
  • 我将更改的项目映射到现有项目。
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 一起工作,以便它理解上述内容 - 或者最好手动映射所有内容?(就我而言,有很多工作)

c# entity-framework automapper entity-framework-6

4
推荐指数
1
解决办法
1014
查看次数