我们正在使用带有 POCO 类(无代理)的 Entity Framework 4.3.1。我们的 User 类存储了一个不应被任何其他用户使用的电子邮件地址。以下测试用于检查此验证:
[TestMethod]
public void UserEmailNotUniqueTest()
{
// arrange
// - create user one and store in db
User userOne = TIF.GetUser(model, true);
// - create user two and store in db
User userTwo = TIF.GetUserTwo(model, true);
// act
// - change user one email to user two email
userOne.EmailAddress = userTwo.EmailAddress;
// - save
model.SaveChanges();
测试初始化创建一个空数据库并将其连接到“模型” DbContext 后代。TIF 类创建用户的测试实例并将它们存储在数据库中。这有效,两个用户都存在于数据库中。此验证要求数据库的状态保持不变,因此我们有一个重写的 SaveChanges 方法,因此我们可以传入可序列化事务:
public virtual int SaveChanges(bool commitWhenDone)
{
try
{
saving = true;
int result;
TransactionScope scope;
using (scope = new TransactionScope( modelTransaction.Get() ))
{
//… open connection etc.
ChangeTracker.DetectChanges();
IEnumerable<DbEntityValidationResult> validationResults =
GetValidationErrors();
//… handle the errors
result = base.SaveChanges();
测试失败,因为没有检测到任何变化。不执行验证代码。检查 model.Entity(userOne).State 返回“Unchanged”,但 CurrentValues 包含正确的值,即 userOne 具有 userTwo 的电子邮件地址。
我们缺少什么?