使用 Moq、NUnit 和 Entity Framework 重新加载保存的实体

Reload a Saved Entity Using Moq, NUnit and Entity Framework

我有一个单元测试(使用 NUnit),我试图在 Entity Framework 中模拟一个添加操作 6. 在添加操作中,我添加了一个新的人实体并重新加载它,所以可以返回新创建的 id。我 运行 遇到的问题是当我想重新加载实体时,出现错误 "The model backing the context has changed since the database was created"。我检查过的 Google 上的所有答案在应用于模拟场景时都没有任何解决方案。

[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?

我发现我使用的是 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; 
}