Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架CTP4:在哪里放置SetInitializer?_C#_.net_Entity Framework_Asp.net Mvc 2 - Fatal编程技术网

C# 实体框架CTP4:在哪里放置SetInitializer?

C# 实体框架CTP4:在哪里放置SetInitializer?,c#,.net,entity-framework,asp.net-mvc-2,C#,.net,Entity Framework,Asp.net Mvc 2,我试图使用CTP4预览将实体框架(代码优先)添加到一个使用测试数据运行的MVC应用程序中 我当前遇到以下错误: 自创建数据库以来,支持“SchedulerContext”上下文的模型已更改。手动删除/更新数据库,或使用IDatabaseInitializer实例调用database.SetInitializer。例如,RecreateDatabaseIfModelChanges策略将自动删除和重新创建数据库,并可以选择使用新数据为其种子。 我根本不想生成数据库,因为我已经有了一个数据库。因此,我

我试图使用CTP4预览将实体框架(代码优先)添加到一个使用测试数据运行的MVC应用程序中

我当前遇到以下错误:

自创建数据库以来,支持“SchedulerContext”上下文的模型已更改。手动删除/更新数据库,或使用IDatabaseInitializer实例调用database.SetInitializer。例如,RecreateDatabaseIfModelChanges策略将自动删除和重新创建数据库,并可以选择使用新数据为其种子。

我根本不想生成数据库,因为我已经有了一个数据库。因此,我尝试将以下内容添加到SchedulerContext构造函数中:

Database.SetInitializer<SchedulerContext>(new CreateDatabaseOnlyIfNotExists<SchedulerContext>());
Database.SetInitializer(新的CreateDatabaseOnlyIfNotExists());
这一点都没有效果——下次运行时我也遇到了同样的错误。错误似乎发生在它执行访问数据库的LINQ语句时——我认为是第一个

我应该把这句话放在哪里,或者这句话就是这个问题的答案吗?

Update 我只是掩盖了一个事实,即您已经有一个数据库,不想再创建一个数据库……在这种情况下,答案是将其放入SchedulerContext类中

protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) {
    modelBuilder.IncludeMetadataInDatabase = false;
}
旧答案 您通常将其放在Global.asax中

protected void Application_Start() {
    Database.SetInitializer<SchedulerContext>(new CreateDatabaseOnlyIfNotExists<SchedulerContext>());
}
受保护的无效应用程序\u Start(){
SetInitializer(新的CreateDatabaseOnlyIfNotExists());
}
请注意,它将仅在首次使用数据上下文时初始化

更新
公共类DataContextInitializer:CreateDatabaseOnlyIfNotExists{
受保护的覆盖无效种子(SchedulerContext上下文){
}
}
然后像这样修改SetInitializer

System.Data.Entity.Infrastructure.Database.SetInitializer<SchedulerContext>(new  DataContextInitializer());
System.Data.Entity.Infrastructure.Database.SetInitializer(新的DataContextInitializer());

问题是ADO.NET团队创建的连接是

 connectionBuilder = new SqlConnectionStringBuilder(sqlConnection.ConnectionString)
                {
                    InitialCatalog = "master",
                    AttachDBFilename = string.Empty, 
                };
但是sqlConnection.ConnectionString是在应用程序配置文件中指定的纯连接字符串,但是没有密码出于安全原因,我认为。。。因此,打开这样的连接将失败


我找到的唯一可能的解决方案是使用集成安全性,这意味着设置连接字符串属性integratedsecurity=SSPI


我们需要等待补丁或CTP5的出现;o) 顺便说一句,从CTP5开始,这是在Global.asax中设置初始值设定项的正确方法

protected void Application_Start() {
    Database.SetInitializer<SchedulerContext>(new CreateDatabaseOnlyIfNotExists<SchedulerContext>());
}
受保护的无效应用程序\u Start()
{
System.Data.Entity.Database.DbDatabase.SetInitializer(新的System.Data.Entity.Database.DropCreateDatabaseIfModelChanges());
}

在EF 4.1中

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
}

我试过了,但没什么区别——我仍然会出错。我甚至尝试更改上下文名称和连接字符串(使用Windows身份验证),并使用“AlwaysCreateDatabase”查看它将创建什么样的数据库。好吧,它不会创造一个。没有给我一个错误,只是没有创建它。我已经在上面的答案中添加了我的初始值设定项,让你知道我是如何实现它的。这也将允许您设置断点,并确保正在调用它。是的!!!确实如此;我现在可以连接到数据库了。不幸的是,现在我在某一点上遇到了以下错误:“此操作需要连接到“master”数据库。无法创建到“master”数据库的连接,因为原始数据库连接已打开,并且凭据已从连接字符串中删除。请提供未打开的连接。”任何想法!(感谢您解决了第一个问题!)根据MSDN论坛上的一个线程,这是MS正在“处理”的问题,但在Global.asax中有以下解决方法:Database.SetInitializer(null);据说,这使得它甚至无法检查数据库的存在。它确实有效。是的,如果你根本不打算创建一个数据库,那么就不需要SetInitializer,这样你就可以继续远程创建它了。很抱歉,真正的答案太晚了,我应该早点看到您的请求,因为我刚才遇到了类似的问题……如果不使用集成安全性,可以选择在连接字符串中添加:Persist Security Info=True。