EF 4 не удалит сущности - PullRequest
1 голос
/ 14 марта 2012

Я должен удалить несколько строк в базе данных.Я использую 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();
    }
}

Ответы [ 3 ]

3 голосов
/ 14 марта 2012

Попробуйте вызвать _databaseContext.SaveChanges () в Given () прямо перед инициализацией _monkeyRemover. Отслеживание изменений может быть запутано, так как монки были добавлены (но не сохранены), а затем удалены.

1 голос
/ 14 марта 2012

Из вашего кода похоже, что вы делаете следующее: 1. Создание новых объектов 2. Удалите объекты, созданные на шаге 1

Конечно, EF не должен взаимодействовать в таком случае с БД, поскольку ваш объект никогда не сохранялся в БД.

1 голос
/ 14 марта 2012

Попробуйте вместо этого:

foreach(var monkey in context.Monkies)
{
    _databaseContext.Monkies.DeleteObject(monkey);
}
_databaseContext.SaveChanges();
...