entity frameworkCTP4:在哪里放置SetInitializer?
我试图使用CTP4预览将entity framework(代码优先)添加到使用测试数据运行的MVC应用程序。
我目前收到此错误:
自创建数据库以来,支持’SchedulerContext’上下文的模型已更改。 手动删除/更新数据库,或使用IDatabaseInitializer实例调用Database.SetInitializer。 例如,RecreateDatabaseIfModelChanges策略将自动删除并重新创建数据库,并可选择使用新数据对其进行种子设定。
我根本不想生成数据库,因为我已经有了一个数据库。 所以我尝试将以下内容添加到SchedulerContext构造函数中:
Database.SetInitializer(new CreateDatabaseOnlyIfNotExists());
它完全没有效果 – 下次运行时我得到了同样的错误。 当它执行访问数据库的LINQ语句时,似乎发生了错误 – 我认为第一个。
我应该把这个陈述放在哪里,或者这个陈述是否是这个问题的答案?
更新
我简单地掩盖了你已经拥有一个数据库并且不想创建另一个数据库的事实…在这种情况下答案是将它放在你的SchedulerContext类中
protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) { modelBuilder.IncludeMetadataInDatabase = false; }
老答案
您通常将它放在Global.asax中
protected void Application_Start() { Database.SetInitializer(new CreateDatabaseOnlyIfNotExists ()); }
请注意,它仅在首次使用数据上下文时初始化。
更新
public class DataContextInitializer : CreateDatabaseOnlyIfNotExists { protected override void Seed(SchedulerContext context) { } }
然后像这样修改SetInitializer。
System.Data.Entity.Infrastructure.Database.SetInitializer(new DataContextInitializer());
顺便说一句,从CTP5开始,这是在Global.asax中设置初始化程序的正确方法
protected void Application_Start() { System.Data.Entity.Database.DbDatabase.SetInitializer
在EF 4.1中
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove(); }
问题是ADO.NET团队创建了连接
connectionBuilder = new SqlConnectionStringBuilder(sqlConnection.ConnectionString) { InitialCatalog = "master", AttachDBFilename = string.Empty, };
但是sqlConnection.ConnectionString是应用程序配置文件中指定的纯连接字符串,但没有密码! 由于安全原因,我认为……所以打开这样的连接失败了 !
我发现唯一可行的解决方案是使用集成安全性,这意味着设置连接字符串属性Integrated Security = SSPI
我们需要等待有补丁或CTP5; o)