繁体   English   中英

EntityFramework正在删除我在dbcontext创建上的记录

[英]EntityFramework is deleting my records on dbcontext creation

在.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循环从不执行,因为DB中没有记录。 当我在执行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的所有引用,并简单地在DB上使用SQL查询。 我没有重新创建数据库就这样做了(所以我使用的是EFCore已创建的数据库)。 当我在不使用EFCore的情况下创建新的SqliteConnection时,我注意到了完全相同的行为。

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

显然,EFCore首先设置数据库的方式非常奇怪,导致了这个问题。 但我不知道它是什么。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM