EntityFramework正在删除我在dbcontext创建

时间:2017-06-20 00:03:54

标签: c# entity-framework sqlite .net-core

在.NET Core项目中,我有以下模型:

public class WrapperContext : DbContext
{
    public DbSet<WrappedFunction> Functions { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder builder)
    {
        builder.UseSqlite("Data Source=functions.db");
    }
}

public class WrappedFunction
{
    [Key]
    public int FunctionId { get; set; }
    public String FunctionName { get; set; }
    public String AssemblyPath { get; set; }
    public String FactoryName { get; set; }
}

如您所见,它是一个Sqlite数据库。

我添加了初始迁移并更新了数据库。在运行我的测试应用程序之前,我已使用单个记录填充了Functions表。我可以用SqliteManager打开数据库,看看记录是否存在。

然后我尝试使用以下函数访问DB:

    static MUinfo getInfoFor(String command)
    {
        UFInfo rv = null;

        using (var ctx = new WrapperContext())  // <---- record disappears here
        {
            foreach (var fn in ctx.Functions)
            {
                if (fn.FunctionName.Equals(command))
                {
                    rv = new UFInfo()
                    {
                        AssemblyPath = fn.AssemblyPath,
                        FactoryName = fn.FactoryName,
                        CommandName = command
                    };
                }
            }
        }

        if (rv != null) return rv;
        return "No Info for " + command;
    }

但是,当单步执行调试器时,我发现foreach循环永远不会执行,因为数据库中没有记录。当我在执行foreach之前停止时,我可以验证(使用SqliteManager)我的单个记录已从数据库中删除。

因此,似乎DbContext对象以某种方式从数据库中删除数据。为什么会这样,我在这里做错了什么?我对EntityFramework相当新,所以我可能做了一些明显的事情,但这对我来说并不明显。

此处还有一点信息。执行db访问的项目是一个库项目。在填充并运行应用程序之前,我必须将数据库复制到应用程序的构建目录。我不知道这是否有所作为。

编辑6/19/17(18:51):

行。更多信息(感谢@StevePy)。 Nunit3似乎与EFCore冲突(虽然我没有在恢复时遇到任何错误)所以我无法为此创建单元测试。所以我在上面的清单中插入一个using (var ctx...)并插入了几个虚拟记录。然后我退出使用块,当我进入一个遍历记录时,他们就在那里。

然而,我随后注释掉了虚拟插入并重新进行了测试。而且,两个记录再次消失。所以EFCore在这里发生了一些非常奇怪的事情。

编辑6/20/17(15:30): 好吧,我仍然不确定发生了什么,但EFCore和Microsoft.Data.Sqlite之间存在奇怪的交互。

我决定删除对EFCore的所有引用,只是在数据库上使用SQL查询。我没有重新创建数据库就这样做了(所以我使用的是EFCore已创建的数据库)。当我在不使用EFCore的情况下创建新的SqliteConnection时,我注意到了完全相同的行为。

在绝望中我删除了数据库并使用Microsoft.Data.Sqlite从头开始重新创建它。显然,该DB没有任何EFCore信息。然后我用数据库填充了一些测试记录并开始使用它。没有更多的消失记录。

显然,EFCore首先设置数据库的方式存在一些非常奇怪的问题。但我不知道它是什么。

1 个答案:

答案 0 :(得分:3)

可能发生的是您正在使用CodeFirst / w EF,但在测试新代码时采用DB第一种方法。 EF跟踪数据库中的模式更改,我的猜测是,通过提前创建表,它不知道架构是否经过审查,因此它会在上下文启动时丢弃并重新创建。

这里的修复应该是创建一个&#34; stub&#34;使用EF模型一次填充测试记录的测试。从那里你应该有一个EF表识别该上下文并接受的表。从那里,您可以在任何编辑器中创建测试记录以进行测试。

SQLite在模式迁移方面有一些限制,您可能也需要考虑这些限制。 (见:https://docs.microsoft.com/en-us/ef/core/providers/sqlite/limitations

首先设置数据库可能会更好,告诉EF如何映射到现有的SQLite模式,而不是尝试使用Code-First,因为迁移对于该数据库引擎来说非常有限。