我有一堆問題試圖爲我的桌面.NET應用程序的SQL Server Compact 4.0數據庫啓用(代碼優先)遷移。SQL Server CE代碼首先遷移問題
Enable-Migrations
確實工作,並且目錄Migrations
被創建。之後,當我嘗試運行Add-Migration InitialMigration
時,得到:
不允許訪問數據庫文件。 [1914,File name = Logo.sdf,SeCreateFile]
這是第一個問題,但我通過以管理員身份運行Visual Studio來解決它...不喜歡該解決方案,也不知道是否稍後在生產中,它將在應用程序未在管理模式下運行的情況下運行。我讓這個問題放在一邊......
我的連接字符串:
<add name="LogoContext"
connectionString="Data Source=Logo.sdf"
providerName="System.Data.SqlServerCE.4.0"/>`
所以在管理員模式下運行Add-Migration InitialMigration
後,我得到一個空遷移......沒關係。然後,我刪除了遷移和添加一個新類:
using System;
using System.Collections.Generic;
public class Blog
{
public int ID { get; set; }
public string Title { get; set; }
}
我添加到上下文類的引用:
public class LogoContext : DbContext
{
public DbSet<Word> Words { get; set; }
public DbSet<User> Users { get; set; }
public DbSet<Blog> Blogs { get; set; }
}
然後再次運行Add-Migration InitialMigration
並獲得:
public partial class InitialMigration : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Blogs",
c => new
{
ID = c.Int(nullable: false, identity: true),
Content = c.String(maxLength: 4000),
})
.PrimaryKey(t => t.ID);
}
public override void Down()
{
DropTable("dbo.Blogs");
}
}
運行後Update-Database
我看到:
Applying code-based migrations: [201304211225255_InitialMigration].
Applying code-based migration: 201304211225255_InitialMigration.
Running Seed method.
現在問題出現 - 在我的服務器資源管理器中,我檢查數據庫Logo.sdf
並且它不包含包括表Blogs
!我甚至試圖從我的應用程序運行這段代碼:
var db = new LogoContext();
db.Posts.Add(new Blog { Title= "moo" });
db.SaveChanges();
檢查也許我的服務器資源管理器沒有顯示錶..但我得到一個異常:
指定的表不存在。 [博客]
所以遷移顯然沒有被應用到我的Logo.sdf
文件:(
如果我從app.config
刪除連接字符串,假設到SQL Server Express的本地實例的連接。而還有它完美的作品!!當我檢查與SQL Server Management Studio中的數據庫,我看到新的Blogs
表,也爲有關遷移的元數據的系統表...
另一個鮮爲人知的資料片:
當我嘗試再次運行Update-Database
時,我得到「沒有待處理的基於代碼的遷移」,並且告訴我一些數據將被保存到Logo.sdf
......畢竟至少有一些關於遷移的元數據,但我仍然可以'在服務器瀏覽器中查看該表。
我使用VS 2012和EF 5.0。
請幫我理解這一點......它看起來很嚴重,因爲它只適用於SQL Server Express實例,但不適用於SQL Server CE 4.0。 :((
謝謝 大衛
建議你開始在連接字符串中有數據庫文件的完整路徑,我的猜測是你有數據庫文件的多個副本,例如在你的bin/debug文件夾中 – ErikEJ 2013-04-21 13:33:13
嗯我也想過這個,但我「確保」VS正在通過刪除bin/Debug版本來訪問正確的Logo.sdf ......我從來沒有用絕對路徑測試過它,因爲我排除了可能在某處存在第三個數據庫副本的選項。 ..在那裏,它是,在「C:\ Program Files文件(x86)\微軟Visual Studio 11.0 \ Common7 \ IDE \ Logo.sdf」...好,這樣神祕解決 - 謝謝..所以我真的有使用文件的絕對路徑?當我編譯解決方案時,編譯的應用程序的配置文件還包含一個絕對路徑,這是不好的...? – davidhq 2013-04-21 13:54:23
在開發過程中使用完整路徑,或者使用您在代碼中構建的連接字符串更好地初始化上下文。 – ErikEJ 2013-04-21 17:36:12