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为空。
以下是我从使用自定义 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,以使用适当的字段创建表。
如果您部署并运行应用程序,它应该连接到数据库,并且能够正常处理您在外部脚本中加载的任何数据。我使用自定义成员资格和角色提供者成功测试了此方法。
| 归档时间: |
|
| 查看次数: |
2133 次 |
| 最近记录: |