Я должен удалить несколько строк в базе данных.Я использую Entity Framework 4.3 (сначала код).У меня есть класс, который отвечает за удаление сущностей / строк.НО, когда я запускаю свою спецификацию, она терпит неудачу, потому что фактически ничего не удаляется.Если я проверю базу данных, предметы все еще там ... никакой работы не было сделано.
Вот мой тест / спецификация:
public class when_removing_all_monkeys
{
DefaultDataContext _databaseContext;
IMonkeyRemover _monkeyRemover;
protected override void Given()
{
Database.DefaultConnectionFactory =
new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");
_databaseContext = new DefaultDataContext();
_databaseContext.Database.Create();
//Builder is from nBuilder, a tool that helps create
// populated objects and lists
Builder<Monkey>.CreateListOfSize(10).Build().ToList()
.ForEach(x => DatabaseContext.Monkies.Add(x));
_monkeyRemover = new MonkeyRemover(_databaseContext);
}
protected override void When()
{
_monkeyRemover.RemoveAll();
}
[Test]
public void it_should_remove_all_the_monkeys()
{
DatabaseContext.Monkies.Count().ShouldEqual(0);
}
protected override void Cleanup()
{
_databaseContext.Database.Delete();
_databaseContext.Dispose();
}
}
А вот мой класс:
public class MonkeyRemover : IMonkeyRemover
{
readonly DefaultDataContext _databaseContext;
public MonkeyRemover(DefaultDataContext databaseContext)
{
_databaseContext = databaseContext;
}
#region IMonkeyRemover Members
public void RemoveAll()
{
_databaseContext.Monkies.ToList()
.ForEach(x => _databaseContext.Monkies.Remove(x));
_databaseContext.SaveChanges();
}
#endregion
}
Я попытался запустить команду SQL для удаления элементов, но когда спецификация не прошла, я предположил, что это произошло потому, что DataContext не знал об изменениях, внесенных командой raw.Однако удаление их через обычные каналы EF, похоже, тоже не помогает.
В прошлый раз, когда у меня возникла эта проблема, я перешел на NHibernate.На этот раз у меня нет такой возможности.
Мысли?
РЕДАКТИРОВАТЬ:
На всякий случай я сделал что-то глупое в моих данныхкласс контекста, вот он для вашего рассмотрения:
public class DefaultDataContext : DbContext
{
public DbSet<Monkey> Monkies { get; set; }
}
РЕШЕНИЕ:
Спасибо @Kiff за ответ.ВАУ ... как просто.Я пропустил одну очень влиятельную линию.Я не сохранял SaveChanges () после создания элементов в разделе Given ().Вот обновленная спецификация:
public class when_removing_all_monkeys
{
DefaultDataContext _databaseContext;
IMonkeyRemover _monkeyRemover;
protected override void Given()
{
Database.DefaultConnectionFactory =
new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");
_databaseContext = new DefaultDataContext();
_databaseContext.Database.Create();
//Builder is from nBuilder, a tool that helps create
// populated objects and lists
Builder<Monkey>.CreateListOfSize(10).Build().ToList()
.ForEach(x => DatabaseContext.Monkies.Add(x));
_databaseContext.SaveChanges(); //forgot to save changes
_monkeyRemover = new MonkeyRemover(_databaseContext);
}
protected override void When()
{
_monkeyRemover.RemoveAll();
}
[Test]
public void it_should_remove_all_the_monkeys()
{
DatabaseContext.Monkies.Count().ShouldEqual(0);
}
protected override void Cleanup()
{
_databaseContext.Database.Delete();
_databaseContext.Dispose();
}
}