在一个.NET Core项目中,我有以下模型:
然而,当我在调试器中逐步执行时,我发现
因此,似乎DbContext对象以某种方式从数据库中删除了数据。这是为什么?我在这里做错了什么?我对EntityFramework相当新,所以我可能做了一些显而易见的事情,但对我来说并不明显。
这里有一个额外的信息。进行db访问的项目是库项目。在填充它并运行应用程序之前,我必须将DB复制到应用程序的构建目录中。我不知道这是否有影响。
编辑6/19/17(18:51):
好的。更多信息(感谢@StevePy)。 Nunit3似乎与EFCore冲突(尽管在还原时我没有收到任何错误),因此我无法为此创建单元测试。因此,我在上面的列表中插入了
但是,然后我注释掉了虚拟插入并重新运行了我的测试。再次,两个记录都消失了。因此,EFCore存在一些非常奇怪的问题。
编辑6/20/17(15:30): 好吧,我仍然不确定发生了什么,但是EFCore和Microsoft.Data.Sqlite之间存在奇怪的交互作用。
我决定删除对EFCore的所有引用,只是在DB上使用SQL查询。我这样做时没有重新创建DB(因此我正在使用EFCore已经创建的DB)。当我创建一个新的SqliteConnection而不使用EFCore时,我注意到完全相同的行为。
绝望地,我从头开始删除了DB,并使用Microsoft.Data.Sqlite重新创建了它。这个DB显然没有任何EFCore信息。然后我用一些测试记录填充了DB并去使用它。不再消失记录。
显然,EFCore在第一次设置数据库时存在某些非常奇怪的问题。但我不知道那是什么。
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访问的项目是库项目。在填充它并运行应用程序之前,我必须将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查询。我这样做时没有重新创建DB(因此我正在使用EFCore已经创建的DB)。当我创建一个新的SqliteConnection而不使用EFCore时,我注意到完全相同的行为。
绝望地,我从头开始删除了DB,并使用Microsoft.Data.Sqlite重新创建了它。这个DB显然没有任何EFCore信息。然后我用一些测试记录填充了DB并去使用它。不再消失记录。
显然,EFCore在第一次设置数据库时存在某些非常奇怪的问题。但我不知道那是什么。