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

相关问题