实体框架4.1-交换数据库



从我读到的所有内容来看,EntityFramework应该是蜜蜂的膝盖,你可以使用CodeFirst从POCO生成实体。令人惊叹的我已经做到了,我让EntityFramework默认行为来做它的事情,现在我背对着墙。

我读到的关于EntityFramework和MVC3应用程序的所有内容,您只需更改web.config中的DBContext连接字符串,它就会自动感知,清除缓存的元数据并重新生成,然后为该上下文调用默认种子或自定义种子方法。我不同意。

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

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

在花了几个sprint时间将模型安装到位,使用控制器和视图之后,我准备使用SQLServerExpress2008迁移到一个过渡环境。所以我问谷歌如何做到这一点,谷歌在这篇博客文章中公然表示,你设置了以实体上下文为名称的连接字符串,其他一切都应该到位。

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

我称之为恶作剧,因为它没有在我列出的数据库中创建表,并且仍然访问默认数据库。这给我留下了两个问题,我确信这是由于我的无知

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

下面是一个我使用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 & "Filesdatabase.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:dbFilesdatabase.s3db", dbFile.FullName)
    Next

End Sub
// 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
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新