实体框架4.1 - 交换数据库

时间:2011-06-01 03:52:03

标签: database entity-framework-4.1

从我读过的所有内容来看,EntityFramework应该是蜜蜂的膝盖,你可以使用CodeFirst从POCO生成实体。真棒!我已经完成了这个,我让EntityFramework默认行为做了它的事情,现在我背对着墙贴着。

我读过有关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"/>

我称之为shenanigans,因为它没有在我列出的数据库中创建表,仍然访问默认数据库。这给我留下了两个问题,而且我从无知中得到了积极的支持

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
        }
    }
}