Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF4韩元';不要删除实体_C#_Entity Framework_Ef Code First - Fatal编程技术网

C# EF4韩元';不要删除实体

C# EF4韩元';不要删除实体,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我必须删除数据库中的一些行。我使用的是实体框架4.3(代码优先)。我有一个类负责删除实体/行。但是,当我运行我的规范时,它失败了,因为实际上没有任何东西被删除。如果我检查数据库,项目仍然存在。。。没有做任何工作 以下是我的测试/规格: public class when_removing_all_monkeys { DefaultDataContext _databaseContext; IMonkeyRemover _monkeyRemover; protected

我必须删除数据库中的一些行。我使用的是实体框架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();
    }
}
我尝试运行SQL命令删除这些项,但当规范失败时,我认为这是因为DataContext不知道raw命令所做的更改。然而,通过EF的正常通道移除它们似乎也不起作用

上次我遇到这个问题时,我最终选择了NHibernate。这次我没有这个选择

想法

编辑:

如果我在数据上下文类中做了一些愚蠢的事情,请仔细阅读:

public class DefaultDataContext : DbContext
{
    public DbSet<Monkey> Monkies { get; set; } 
}
公共类DefaultDataContext:DbContext { 公共DbSet Monkies{get;set;} } 解决方案:

感谢@Kiff的回答。哇!多简单啊。我遗漏了一条非常有影响力的路线。在给定()部分中创建项后,我没有保存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();
    }
}
移除所有猴子时的公共类 { DefaultDataContext\u databaseContext; IMonkeyRemover\u monkeyRemover; 给定的受保护覆盖无效() { Database.DefaultConnectionFactory= 新的SqlCeConnectionFactory(“System.Data.SqlServerCe.4.0”); _databaseContext=新的DefaultDataContext(); _databaseContext.Database.Create(); //Builder来自nBuilder,一个帮助创建 //填充的对象和列表 Builder.CreateListOfSize(10.Build().ToList()) .ForEach(x=>DatabaseContext.Monkies.Add(x)); _databaseContext.SaveChanges();//忘记保存更改 _monkeyRemover=新的monkeyRemover(_databaseContext); } 受保护的覆盖在()时无效 { _monkeyRemover.RemoveAll(); } [测试] 公开作废它应该移除所有的猴子() { DatabaseContext.Monkies.Count().ShouldEqual(0); } 受保护的覆盖无效清除() { _databaseContext.Database.Delete(); _databaseContext.Dispose(); } } 试试这个:

foreach(var monkey in context.Monkies)
{
    _databaseContext.Monkies.DeleteObject(monkey);
}
_databaseContext.SaveChanges();
请尝试以下方法:

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

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


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

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


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

在初始化monkeyRemover之前,请尝试调用给定()中的_databaseContext.SaveChanges()。更改跟踪器可能会变得混乱,因为Monkie被添加(但未保存)然后被删除。

在初始化monkeyRemover之前,尝试调用给定()中的_databaseContext.SaveChanges()。更改跟踪器可能会变得混乱,因为Monkie被添加(但未保存)然后被删除。

您是否检查了实体是否具有状态EntityState.Deleted?您的代码或数据库中一定有错误(即触发器阻止删除)。@TomasVoracek,每次运行规范时都会重新创建数据库,因此我无法想象数据库中有触发器或其他东西阻止删除。我正在检查entityState。您的示例代码不一致有时您编写
\u databaseContext
有时
databaseContext
。。。也许你在测试中使用了两个DbContext。。。你能清理一下你的样本吗?@nemesv:是的,我可能是在你输入评论时清理的。它确实使用了一个在规范的给定部分实例化和注入的数据上下文。@TomasVoracek:我检查了,并且.Remove()之后每个实体的EntityState都被“删除”。因此,EF至少改变了实体的状态。但是,在我的规范中,当我重新查询相同的项目时,它们仍然返回。我遗漏了什么?您是否检查了实体是否具有状态EntityState.Deleted?您的代码或数据库中一定有错误(即触发器阻止删除)。@TomasVoracek,每次运行规范时都会重新创建数据库,因此我无法想象数据库中有触发器或其他东西阻止删除。我正在检查entityState。您的示例代码不一致有时您编写
\u databaseContext
有时
databaseContext
。。。也许你在测试中使用了两个DbContext。。。你能清理一下你的样本吗?@nemesv:是的,我可能是在你输入评论时清理的。它确实使用了一个在规范的给定部分实例化和注入的数据上下文。@TomasVoracek:我检查了,并且.Remove()之后每个实体的EntityState都被“删除”。因此,EF至少改变了实体的状态。但是,在我的规范中,当我重新查询相同的项目时,它们仍然返回。我遗漏了什么?我在谷歌中看到了.DeleteObject(),但在DbSet api中这不是一个选项。DbSet上唯一远程关闭的方法是.Remove()。我在Google中看到过.DeleteObject(),但在DbSet api中这不是一个选项。DbSet上唯一远程关闭的方法是.Remove()。