【问题标题】:Entity Framework 4.1 - Swapping DatabasesEntity Framework 4.1 - 交换数据库
【发布时间】:2011-06-01 03:52:02
【问题描述】:

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

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

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

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

在花了几个 sprint 准备好模型、使用控制器和视图之后,我已经准备好使用 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"/>

我称之为恶作剧,因为它没有在我列出的数据库中创建表,并且仍在访问默认数据库。这给我留下了 2 个问题,我很肯定这源于我的无知

  1. Entity Framework 默认调用的 SQL Server Express(或者是 CE)的默认数据库位于何处?
  2. 更新连接时,程序员是否需要更多的交互才能获得交换 DB 的行为?

【问题讨论】:

    标签: database entity-framework-4.1


    【解决方案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
    

    【讨论】:

    • 在使用这个 sn-p 之后,它暴露了一个有趣的连接字符串:LocalSqlServer 和 ApplicationServices - 显然正在使用的仅有的两个连接字符串。 -- 我已经重置了它们并且它仍然使用旧数据库:|
    • 你试过清除默认连接&lt;connectionStrings&gt;&lt;clear/&gt;&lt;add ...
    • 成功了,为我熬夜破解这个项目提供了正确的方法。谢谢埃兰加
    【解决方案2】:
    // 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
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 2012-02-03
      • 2011-11-06
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多