问题描述
|
从我阅读的所有内容来看,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迁移到暂存环境。因此,我问google先生如何做到这一点,它公开声明在此博客文章中,您将连接字符串设置为实体上下文作为名称,其他所有内容都应放置到位。
<connectionStrings>
<add name=\"MyContext\"
connectionString=\"Server=server;Database=awesome_sauce;User ID=noob;Password=noob;Trusted_Connection=False;\"
providerName=\"System.Data.sqlClient\"/>
我称其为shenanigans,因为它没有在我列出的数据库中创建表,而仍在访问默认数据库。这给我留下了2个问题,我很确定这是我的无知
实体框架默认调用的sql Server Express(或CE)默认数据库位于哪里?
更新连接时,程序员是否需要更多交互才能获得交换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 & \"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
, // 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
}
}
}