EF 4不会删除实体

时间:2012-03-14 15:55:11

标签: c# entity-framework ef-code-first

我必须删除数据库中的一些行。我正在使用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; } 
}

SOLUTION:

感谢@Kiff的回答。哇...多么简单。我遗漏了一条非常有影响力的路线。在Given()部分创建项目后,我没有SaveChanges()。这是更新的规范:

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 个答案:

答案 0 :(得分:3)

在初始化_monkeyRemover之前尝试在Given()中调用_databaseContext.SaveChanges()。由于monkies被添加(但未保存)然后被删除,变更跟踪器可能会变得混乱。

答案 1 :(得分:1)

请改为尝试:

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

答案 2 :(得分:1)

从您的代码中看起来您正在执行以下操作: 1.创建新对象 2.删除在步骤1中创建的对象

确保EF不应该在这种情况下与DB交互,因为您的对象从未存储在db。