为了账号安全,请及时绑定邮箱和手机立即绑定

模拟对同一实体的 2 个或多个 DBContext 调用失败

模拟对同一实体的 2 个或多个 DBContext 调用失败

C#
胡说叔叔 2022-11-13 14:21:47
我有一个使用 Entity Framework v6.0 和员工表的 MVC ASP.Net 应用程序。我们使用 Code First 方法和标准 Create (CRUD) 方法,该方法具有对现有员工的 EF 查找以及对员工 CreatedBy/ModifiedBy 字段的 EF 查找。尝试为两者(EF 对象存根)创建模拟失败。[HttpPost][ValidateAntiForgeryToken]public ActionResult Create([Bind(Include = "EmployeeID,TeamID,EmployeeADID,FirstName,MiddleName,LastName,EmailAddress,IsAdministrator,IsDeleted")] Employee employee){    if (ModelState.IsValid)    {        //Only unique employee IDs        var existingEmployee = db.Employees.FirstOrDefault(o => o.EmployeeADID == employee.EmployeeADID);        if(existingEmployee != null)        {            ViewBag.Error = "Employee ID must be unique, this employee (" + existingEmployee.FullName + ") already exists in the system.";            ViewBag.TeamID = new SelectList(db.Teams, "TeamID", "Name", employee.TeamID);            return View(existingEmployee);        }        SetAuditFields(employee);        db.Employees.Add(employee);        db.SaveChanges();        return RedirectToAction("Index");    }        ViewBag.TeamID = new SelectList(db.Teams, "TeamID", "Name", employee.TeamID);    return View(employee);}问题是SetAuditFields调用,我需要为编辑操作模拟db.Employees.AsNoTracking AsNoTracking。private void SetAuditFields(Employee employee, bool onlyModified = false){    char sep = '\\';    string pID = User.Identity.Name.Split(sep)[1].ToUpper();    var users = db.Employees.AsNoTracking().Where(c => c.EmployeeADID == pID || c.EmployeeID == employee.EmployeeID).ToList();    var currentUser = users.FirstOrDefault(u => u.EmployeeADID == pID);那么我如何db.Employees.AsNoTracking在最初模拟之后模拟db.Employees呢?下面代码中注释掉的这两行不起作用并失败:“成员 'IQueryable.Provider' 尚未在类型 'DbSet 1Proxy' which inherits from 'DbSet1'上实现我也尝试过,mockContext.SetupSequence但我需要在打开和关闭 AsNoTracking 之间进行交换。当然一定有我遗漏的东西吗?
查看完整描述

1 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

我最终根据https://stackoverflow.com/a/14368486/495455使用计数器创建了一系列模拟


int callCounter = 1;

mockContext.Setup(m => m.Employees)

    .Returns(() =>

    {

        if (callCounter == 1)

        {

            callCounter++;

            return employeeToEditMockCU;

        }

        else

        {

            return employeeMockCU;

        }

    });

在第一次模拟之后,使用 SetupSequence 进行模拟对我不起作用。db.Employee 在第一次调用后变为空。所以我不使用SetupSequence:


mockContext.SetupSequence(x => x.Employees)

.Returns(employeeToEditMockCU)

.Returns(employeeMockCU);

为了解决这个问题,AsNoTracking()我最终获取了要更新的记录并在不使用的情况下保存它EntityState.Modified:


EF Update using EntityState.Modified


查看完整回答
反对 回复 2022-11-13
  • 1 回答
  • 0 关注
  • 111 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号