2016-08-01 170 views
0

我有一個單元測試(使用NUnit),我試圖在實體框架6中模擬添加操作。在添加操作中,我添加一個新的人實體並重新加載它,以便可以返回新創建的ID。我遇到的問題是當我想重新加載實體時,我得到錯誤,「自創建數據庫以來支持上下文的模型已經發生了變化」。我在Google上查到的所有答案在應用於嘲笑場景時都沒有任何解決方案。使用Moq,NUnit和實體框架重新加載實體

[Test] 
[Description("Add")] 
public void Add() 
{ 
    var person = new Person 
    { 
     FirstName = "John", 
     LastName = "Doe", 
     Dob = new DateTime(1984, 8, 23), 
     Ssn = "555-55-5555" 
    }; 

    var mockDbSet = new Mock<DbSet<Person>>(); 
    mockDbSet.Setup(s => s.Create()).Returns(new Person()); 

    var mockContext = new Mock<PersonContext>(); 
    mockContext.Setup(c => c.People).Returns(mockDbSet.Object); 

    context.Object.People.Add(person); 
    context.Object.SaveChanges(); 

    // This code will throw an error. 
    //context.Object.Entry(person).Reload(); 

    mockDbSet.Verify(m => m.Add(It.IsAny<Person>()), Times.Once()); 
    mockContext.Verify(m => m.SaveChanges(), Times.Once()); 

    // To do: Test that the id was populated from the reload operation. 
} 

我能做些什麼來重新加載實體並檢索新的ID?

+3

您不必重新加載實體。它的Id值應該在'SaveChanges'中設置。你可能想嘲笑,但我認爲這是沒用的。你測試的唯一東西是模擬框架是否工作。 (我不相信嘲笑數據庫交互)。 –

回答

0

我發現我使用的是EF 5的舊代碼。我更新了這個答案以包含兩種方法。

// This is how to return a newly inserted id from EF 6. 
public int AddMyEntity(MyEntity myEntity) 
{ 
    dbContext.MyEntities.Add(myEntity); 
    context.SaveChanges(); 
    return myEntity.Id; 
} 

// This is how to return a newly inserted id from EF 5. 
public int AddMyEntity(MyEntity myEntity) 
{ 
    dbContext.MyEntities.Add(myEntity); 
    dbContext.SaveChanges(); 
    dbContext.Entry(myEntity).Reload(); 
    return myEntity.Id; 
}