为什么不';t我的实体框架代码第一个DbContext显示我填充的表中的实体
本文关键字:实体 显示 DbContext 填充 第一个 代码 框架 我的 为什么不 | 更新日期: 2023-09-27 18:25:03
我正试图将我的应用程序部署到测试环境中,但无法让实体框架很好地处理数据库。在开发过程中,我使用了一个数据库初始值设定器来为数据库进行种子设定,这一点非常完美。但是,当我将应用程序部署到实际的IIS实例时,我无法使它与数据库接口。我的自定义初始化规则根本没有运行,所以我改为手动创建数据库。
我使用ObjectContext.CreateDatabaseScript()作为SQL脚本的起点,SSMS验证是否在适当的表中填充了两行。
我的问题出现在运行应用程序之后。我有自定义的成员资格和角色提供程序,它们似乎都没有检测到数据库中存在这两个角色。
我如何让我的实体框架识别出这些行不是空的?我目前正在使用存储库中的私有DbContext来处理与实体框架的通信,并禁用了我的自定义初始化器,直到这个问题得到解决。
尝试在数据库中查找角色的代码:
context.Roles.Single(r => r.Name == role)
数据库在角色表中显示以下内容:
Id Name Description
1 Company NULL
2 Customer NULL
LINQ生成一个空序列异常作为上下文。角色为空。
根据注释判断,实体框架和数据库之间似乎没有连接。你没有提到你正在使用的实体框架的哪个版本,但我认为你已经更新到了最新版本(截至撰写本文时为4.3)。
我注意到你说你在"手动创建数据库"。为什么不打开一个测试项目,在手动创建的数据库的基础上创建一个新的数据库优先模型呢?这至少应该确认您可以在配置中使用实体框架。从那时起,我将从头开始创建另一个项目来测试代码优先方法。
以下是我从代码优先项目迁移到非易失性数据库设置的步骤,该项目具有自定义IDatabaseInitializer实现,在每个会话期间将数据库重置为非易失数据库设置。
首先,通过运行以下代码并将输出放置在可访问的位置(即:桌面上的文件、浏览器中的原始文本等),在您的开发项目中复制实体框架生成的架构context是从DbContext继承的类的实例:
((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript()
其次,将该调用返回的字符串保存在SQL文件中。请确保删除创建实体框架元数据表的命令。该命令应类似于以下内容:
create table [dbo].[EdmMetadata]
(
[Id] [int] not null identity,
[ModelHash] [nvarchar](max) null,
primary key ([Id])
);
接下来,删除为数据库植入种子的代码。我使用了AppSetting,这样我就可以在部署后轻松切换代码的使用,而无需重新编译和部署。
if (ConfigurationManager.AppSettings["Mode"] == "Dev")
{
Database.SetInitializer<PonosContext>(new PonosInitializer());
new MyContext().Database.Initialize(true);
}
在该语句之外,您仍然需要初始化数据库,但请确保传入false,这样只有在数据库尚未初始化时才会进行初始化。
new MyContext().Database.Initialize(false);
最后,在一个空数据库上运行安装SQL,以使用适当的字段创建表。
如果您部署并运行应用程序,它应该连接到数据库,并且能够正常处理您在外部脚本中加载的任何数据。我用自定义成员资格和角色提供程序成功地测试了这种方法。