[英]Using EntityFramework dbContext to get records with count in another table
[英]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.