EF 4赢得';t删除实体
本文关键字:删除 实体 赢得 EF | 更新日期: 2023-09-27 18:27:42
我必须删除数据库中的一些行。我使用的是实体框架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不知道原始命令所做的更改。然而,通过EF的正常通道去除它们似乎也没有效果。
上一次我遇到这个问题时,我最终选择了NHibernate。这次我没有这个选择。
想法?
编辑:
为了防止我在数据上下文类中做了一些愚蠢的事情,这里是供您仔细检查的:
public class DefaultDataContext : DbContext
{
public DbSet<Monkey> Monkies { get; set; }
}
解决方案:
感谢@Kiff的回答。哇。。。多么简单。我漏掉了一句很有影响力的话。在Given()部分创建项目后,我没有保存Changes()。这是更新的规格:
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();
}
}
在初始化_monkeyRemover之前,尝试在Given()中调用_databaseContext.SaveChanges()。更改跟踪器可能会感到困惑,因为这些怪物是添加(但没有保存)然后删除的。
试试这个:
foreach(var monkey in context.Monkies)
{
_databaseContext.Monkies.DeleteObject(monkey);
}
_databaseContext.SaveChanges();
从您的代码来看,您正在执行以下操作:1.创建新对象2.删除在步骤1 中创建的对象
当然,EF不应该在这种情况下与DB交互,因为您的对象从未存储在DB中。