从我读到的所有内容来看,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"/>
我称之为恶作剧,因为它没有在我列出的数据库中创建表,并且仍然访问默认数据库。这给我留下了两个问题,我确信这是由于我的无知
- 实体框架默认调用的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 & "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
}
}
}