gpt4 book ai didi

c# - EntityFramework 正在删除我在创建 dbcontext 时的记录

转载 作者:行者123 更新时间:2023-11-30 15:57:43 25 4
gpt4 key购买 nike

在 .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 打开数据库以查看记录。

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

    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 的新手,所以我可能做了一些显而易见的事情,但对我来说并不明显。

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

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

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

但是,我随后注释掉了虚拟插入并重新运行我的测试。而且,两条记录又一次消失了。因此,EFCore 发生了一些非常奇怪的事情。

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

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

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

显然,EFCore 最初设置数据库的方式有一些非常奇怪的地方导致了这个问题。但我不知道那是什么。

最佳答案

可能发生的情况是您正在使用 CodeFirst/w EF,但在测试新代码时采用数据库优先方法。 EF 跟踪数据库中的架构更改,我的猜测是,通过您提前创建表,它不知道架构已经过审查,因此它会在上下文启动时删除并重新创建它。

此处的解决方法应该是创建一个“ stub ”测试,使用您的 EF 模型一次填充测试记录。从那里你应该有一个 EF 根据该上下文识别并接受的表。从那里您可以在任何编辑器中创建测试记录以用于测试目的。

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

您最好先设置数据库,告诉 EF 如何映射到现有的 SQLite 模式,而不是尝试使用代码优先,因为该数据库引擎的迁移非常有限。

关于c# - EntityFramework 正在删除我在创建 dbcontext 时的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44641700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com