Ответ 1
У вас будет тестовое тестирование проблемы с CE4, если у вашей модели есть сгенерированные с помощью базы данных ключи (обычно указанные в EF4 с помощью аннотации [DatabaseGenerated (DatabaseGeneratedOption.Identity)], поскольку CE4 не поддерживает это.
Но я нашел легкое обходное решение без необходимости изменять мой производственный код (который работает на SQL 2008). Я создал прокси-подкласс моего DbContext, и в нем overrode OnModelCreating
, чтобы удалить аннотацию, и переопределить SaveChanges
, чтобы установить идентификатор вручную:
public class TestContext : MyDbContext
{
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>().Property(e => e.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
base.OnModelCreating(modelBuilder);
}
public override int SaveChanges()
{
foreach (var entry in ChangeTracker.Entries<MyEntity>().Where(e => e.State == EntityState.Added))
{
entry.Entity.Id = Guid.NewGuid();
}
return base.SaveChanges();
}
}
С этими незначительными изменениями я могу теперь unit test тот же код репозитория в CE4, который работает под SQL 2008 в процессе производства.
И если вы используете идентификаторы целого числа, а не GUID, здесь есть хороший метод расширения, который можно подключить прямо к вышеупомянутому решению: http://enigmadomain.wordpress.com/2010/01/06/sql-compact-identity-columns-and-entity-framework/