2011-06-01 144 views
2

从我读过的所有东西,EntityFramework应该是蜜蜂膝盖,你可以使用CodeFirst从POCO生成实体。真棒!我已经这样做了,我让EntityFramework的默认行为完成了它的事情,现在我被困在墙背上。实体框架4.1 - 交换数据库

我已经读过关于EntityFramework和MVC3应用程序的一切,你可以在你的web.config中更改DBContext连接字符串,它应该自动感知,清除它已经缓存并重新生成的元数据,并且调用默认值种子或您的自定义种子方法。我不敢苟同。

我有一个非常简单的数据库上下文类:

namespace AwesomeApp.Models 
{ 
    public class MyContext : DbContext 
    { 
     public DbSet<Sneeze> Sneeze { get; set; } 
    } 
} 

已经花了几个冲刺越来越到位的模式,与控制器和视图的工作后,我准备好迁移到分段使用SQLServer Express 2008的环境。所以我问谷歌如何做到这一点,它明目张胆地指出,在这篇博客文章中,您将连接字符串设置为实体上下文作为名称,其他所有内容都应该落实到位。

<connectionStrings> 
<add name="MyContext" 
    connectionString="Server=server;Database=awesome_sauce;User ID=noob;Password=noob;Trusted_Connection=False;" 
    providerName="System.Data.SqlClient"/> 

我要举报,在我列出的数据库它不是在创建表(S),并仍在访问默认数据库。这给我留下了2个问题,我敢肯定它得紧从我的无知

  1. 在哪里默认数据库位于SQL Server Express的(或者是CE)是实体框架默认调用?
  2. 当您更新连接时,程序员是否需要更多的交互来获得交换数据库的行为?

回答

1

以下是我使用SQLite DB动态更改路径的示例...对于任何SQL都可以采用相同的逻辑。我把这个在我的我的WPF应用程序的application.xaml(所以把概率在你的Application_Start)

' Application-level events, such as Startup, Exit, and DispatcherUnhandledException 
' can be handled in this file. 

Public Sub New() 

    'Attempt to load the db file 
    Dim dbFile As New IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory & "Files\database.s3db") 

    'Loop till we get liteEntities 
    For Each item As System.Configuration.ConnectionStringSettings In ConfigurationManager.ConnectionStrings 
     If item.Name <> "liteEntities" Then Continue For 

     'Allow us to update this ite 
     Dim fi = GetType(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance Or BindingFlags.NonPublic) 
     fi.SetValue(item, False) 

     'Update it 
     item.ConnectionString = Replace(item.ConnectionString, "C:\db\Files\database.s3db", dbFile.FullName) 

    Next 


End Sub 
+0

使用这个片段也暴露了一个有趣的连接字符串后:LocalSqlServer,并ApplicationServices - 仅有的两个连接字符串这显然正在使用。 - 我已将它们重置并仍然使用旧数据库:| – lazyPower 2011-06-01 04:42:03

+3

是否尝试清除默认连接' Eranga 2011-06-01 04:55:14

+0

这样做的诀窍,为我熬夜对这个项目进行黑客入侵提供了方便。谢谢Eranga – lazyPower 2011-06-01 06:25:03

1
// for a website: 
[assembly: System.Web.PreApplicationStartMethod(typeof (MyContextNS.MyContextInitializer), "Application_Start")] 
// or just call MyContextNS.MyContext.Application_Start(); before using MyContext 
namespace MyContextNS 
{ 
    public class MyContextInitializer 
     : DropCreateDatabaseAlways<MyContext> 
     // : DropCreateDatabaseIfModelChanges<MyContext> 
    { 
     public static void Application_Start() { 
      var initializer = new MyContextInitializer(); 
      Database.SetInitializer<MyContext>(initializer); 
     } 
     protected override void Seed(MyContext context) { 
      base.Seed(context); 
      // ... initialize 
     } 
    } 
}