我正在尝试将我的应用部署到测试环境,但无法让Entity Framework与数据库很好地配合。在开发过程中,我使用数据库初始化程序来为数据库设定种子并且运行良好。但是,当我将应用程序部署到实际的IIS实例时,我无法将其与数据库连接。我的自定义初始化规则根本没有运行,所以我改为手动创建数据库。
我使用ObjectContext.CreateDatabaseScript()作为我的SQL脚本的起点,SSMS验证是否在相应的表中填充了两行。
运行应用程序后出现问题。我有自定义成员资格和角色提供程序,它们似乎都没有检测到数据库中存在这两个角色。
如何让我的实体框架识别出这些行不为空?我目前正在使用存储库中的私有DbContext来处理与Entity Framework的通信,并禁用我的自定义初始化程序,直到此打嗝得到解决。
尝试在数据库中查找角色的代码:
context.Roles.Single(r => r.Name == role)
数据库在Roles表中显示以下内容:
Id Name Description
1 Company NULL
2 Customer NULL
LINQ生成一个空序列异常,因为context.Roles为空。
答案 0 :(得分:0)
根据评论来看,实体框架与数据库之间没有任何联系。您没有提到您正在使用的实体框架版本,但我认为您已更新到最新版本(截至撰写本文时为4.3)。
我注意到你说你是“手动创建数据库”。为什么不打开测试项目并根据手动创建的数据库创建新的数据库第一个模型?这至少应该确认您可以在配置中使用Entity Framework。 从那里我将从头开始创建另一个项目来测试Code First方法。
答案 1 :(得分:0)
以下是我使用自定义IDatabaseInitializer实现从代码优先项目迁移的步骤,该实现在每个会话期间将数据库重置为非易失性数据库设置。
首先,在您的dev中复制Entity Framework生成的架构。通过运行以下代码并将输出放在可访问的位置(即:桌面上的文件,浏览器中的原始文本等)来进行项目。 上下文是您的类的一个实例,它继承自 DbContext :
((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript()
其次,将该调用返回的字符串保存在SQL文件中。请务必删除创建Entity Framework元数据表的命令。此命令应类似于以下内容:
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,以使用适当的字段创建表。
如果部署然后运行应用程序,它应该连接到数据库,并且能够正常使用您在外部脚本中加载的任何数据。我用自定义成员资格和角色提供程序成功测试了此方法