为什么我的实体框架代码第一个DbContext没有显示填充表中的实体?

XBi*_*13X 5 c# asp.net-mvc entity-framework entity-framework-4 asp.net-mvc-4

我正在尝试将我的应用程序部署到测试环境,但是无法使Entity Framework与数据库完美配合。在开发中,我使用数据库初始化程序来为数据库添加种子,并且该程序工作正常。但是,当我将应用程序部署到实际的IIS实例时,无法使其与数据库接口。我的自定义初始化规则根本没有运行,所以我改为手动创建数据库。

我使用ObjectContext.CreateDatabaseScript()作为我的SQL脚本的起点,并且SSMS验证了在适当的表中是否填充了两行。

运行应用程序后出现我的问题。我有自定义的成员资格和角色提供程序,它们似乎都无法检测到数据库中存在这两个角色。

如何使我的实体框架识别这些行不是空的?我当前在存储库中使用私有DbContext处理与Entity Framework的通信,并禁用了我的自定义初始化程序,直到此问题解决为止。

尝试在数据库中查找角色的代码:

context.Roles.Single(r => r.Name == role)
Run Code Online (Sandbox Code Playgroud)

该数据库在“角色”表中显示以下内容:

Id  Name     Description
1   Company  NULL
2   Customer NULL
Run Code Online (Sandbox Code Playgroud)

LINQ生成一个空序列异常,例如context.Roles为空。

XBi*_*13X 0

以下是我从使用自定义 IDatabaseInitializer 实现的代码优先项目迁移到非易失性数据库设置的步骤,该实现在每个会话期间将数据库重置。

首先,将实体框架生成的架构复制到您的开发中。通过运行以下代码并将输出放置在可访问的位置(即:桌面上的文件、浏览器中的原始文本等)来完成项目。context是继承自DbContext的类的实例:

((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript()
Run Code Online (Sandbox Code Playgroud)

其次,将从该调用返回的字符串保存在 SQL 文件中。请务必删除创建实体框架元数据表的命令。该命令应类似于以下内容:

create table [dbo].[EdmMetadata] 
( 
    [Id] [int] not null identity, 
    [ModelHash] [nvarchar](max) null, 
    primary key ([Id]) 
);
Run Code Online (Sandbox Code Playgroud)

接下来,删除为数据库播种的代码。我使用了 AppSetting,这样我就可以在部署后轻松切换代码的​​使用,而无需重新编译和部署。

if (ConfigurationManager.AppSettings["Mode"] == "Dev")
{
    Database.SetInitializer<PonosContext>(new PonosInitializer());
    new MyContext().Database.Initialize(true);
}
Run Code Online (Sandbox Code Playgroud)

在该语句之外,您仍然需要初始化数据库,但请确保传入false,以便仅在数据库尚未初始化时才会进行初始化。

new MyContext().Database.Initialize(false);
Run Code Online (Sandbox Code Playgroud)

最后,在空数据库上运行设置 SQL,以使用适当的字段创建表。

如果您部署并运行应用程序,它应该连接到数据库,并且能够正常处理您在外部脚本中加载的任何数据。我使用自定义成员资格和角色提供者成功测试了此方法。