7

我有一堆問題試圖爲我的桌面.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。 :((

謝謝 大衛

+2

建議你開始在連接字符串中有數據庫文件的完整路徑,我的猜測是你有數據庫文件的多個副本,例如在你的bin/debug文件夾中 – ErikEJ 2013-04-21 13:33:13

+0

嗯我也想過這個,但我「確保」VS正在通過刪除bin/Debug版本來訪問正確的Logo.sdf ......我從來沒有用絕對路徑測試過它,因爲我排除了可能在某處存在第三個數據庫副本的選項。 ..在那裏,它是,在「C:\ Program Files文件(x86)\微軟Visual Studio 11.0 \ Common7 \ IDE \ Logo.sdf」...好,這樣神祕解決 - 謝謝..所以我真的有使用文件的絕對路徑?當我編譯解決方案時,編譯的應用程序的配置文件還包含一個絕對路徑,這是不好的...? – davidhq 2013-04-21 13:54:23

+0

在開發過程中使用完整路徑,或者使用您在代碼中構建的連接字符串更好地初始化上下文。 – ErikEJ 2013-04-21 17:36:12

回答

5

所以,問題是該解決方案在這裏創造一個單獨的.sdf文件:

「C:\ Program Files文件(x86)的\微軟的Visual Studio 11.0 \ Common7 \ IDE \ Logo.sdf」

這是意外和奇怪恕我直言...

我結束了使用此連接字符串:

<add name="LogoContext" connectionString="Data Source=|DataDirectory|\Logo.sdf" providerName="System.Data.SqlServerCE.4.0"/> 

這引用bin/Debug/Logo.sdf,它在開發過程中以及單獨運行.exe時有效。

這種方式唯一的事情就是我的Logo.sdf項目文件(被複制到調試「如果更新」)現在完全被忽略。所有的遷移將在調試文件上運行..這可能是太好了....

Thanx Erik的提示! 大衛

+0

也可以確認這適用於IIS Express的Web調試。在我的情況下,它試圖創建到「C:\ Program Files文件(86)\ IIS Express \ db.sdf」 – Jens 2014-08-15 10:27:45

相關問題