我必須刪除數據庫中的一些行。我使用Entity Framework 4.3(代碼優先)。我有一個負責刪除實體/行的類。但是,當我運行我的規格時,它失敗了,因爲沒有任何東西被刪除。如果我檢查數據庫,項目仍然存在......沒有工作完成。EF 4不會刪除實體
這裏是我的測試/規格:
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; }
}
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();
}
}
你是否檢查過實體是否有狀態EntityState.Deleted?你的代碼或數據庫中肯定有問題(即觸發防止刪除)。 – 2012-03-14 16:14:39
@TomasVoracek,每次運行規範時都會創建新的數據庫,所以我無法想象觸發器或數據庫中的某些內容會阻止刪除操作。我正在檢查entityState。 – 2012-03-14 16:33:13
您的示例代碼有時不一致,有時候您會編寫'_databaseContext'有時候'DatabaseContext' ...也許您在測試中使用了兩個DbContext ...可以清理您的示例嗎? – nemesv 2012-03-14 16:48:42