繁体   English   中英

为什么我的实体框架代码不首先DbContext显示我填充的表中的实体?

[英]Why doesn't my Entity Framework code first DbContext show the entities from my populated table?

我正在尝试将我的应用程序部署到测试环境,但无法让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为空。

从评论来看,实体框架和数据库之间没有任何联系。 您没有提到您正在使用的实体框架版本,但我认为您已更新到最新版本(截至撰写本文时为4.3)。

我注意到你说你是“手动创建数据库”。 为什么不打开测试项目并根据手动创建的数据库创建新的数据库第一个模型? 这至少应该确认您可以在配置中使用Entity Framework。 从那里我将从头开始创建另一个项目来测试Code First方法。

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

首先,在您的dev中复制Entity Framework生成的模式。 通过运行以下代码并将输出放在可访问的位置(即:桌面上的文件,浏览器中的原始文本等)来进行项目。 context是继承自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,以使用适当的字段创建表。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM