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 の電子メール アドレスがあります。
何が欠けていますか?