亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

模擬對同一實體的 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呢?下面代碼中注釋掉的這兩行不起作用并失?。骸俺蓡T '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 關注
  • 92 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號