SQL Server CE Code First 迁移问题

7
我有一系列问题,尝试为我的桌面.NET应用程序的SQL Server Compact 4.0数据库启用(代码优先)迁移。 Enable-Migrations 可以工作并创建目录 Migrations。之后,当我尝试运行 Add-Migration InitialMigration 时,我得到以下错误信息:

不允许访问数据库文件。[1914,文件名=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();

我想检查一下我的服务器资源管理器是否显示了表格...但我收到了一个异常:

指定的表不存在。[Blogs]

所以我的迁移显然没有应用到我的 Logo.sdf 文件 :(

如果我从 app.config 中移除连接字符串,就会假定连接到本地安装的 SQL Server Express。在那里它可以完美运行!当我使用 SQL Server Management Studio 检查数据库时,我看到了新的 Blogs 表格和关于迁移的元数据的系统表...

另一个小信息:

当我再次尝试运行 Update-Database 时,我得到了 "No pending code-based migrations." 的消息,这告诉我确实保存了一些数据到 Logo.sdf 中...至少是一些有关迁移的元数据,但仍然无法在服务器资源管理器中看到该表格。

我正在使用 VS 2012 和 EF 5.0。

请帮我理解一下...看起来有严重的问题,因为它只能在 SQL Server Express 实例上工作,而不能在 SQL Server CE 4.0 上工作。:((

谢谢! 大卫


2
建议您从在连接字符串中使用数据库文件的完整路径开始,我猜您可能有多个数据库文件的副本,例如在bin/debug文件夹中。 - ErikEJ
嗯,我也考虑过这个问题,但是我通过删除bin/Debug版本来“确保”VS正在访问正确的Logo.sdf。我从未使用绝对路径进行测试,因为我排除了可能存在第三个副本的选项...然后,在“C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Logo.sdf”中找到了它...好的,那么这个谜团就解决了-谢谢。所以我真的必须使用文件的绝对路径吗?当我编译解决方案时,编译应用程序的配置文件也包含一个绝对路径,这不好...? - davidhq
在开发过程中,请使用完整路径,或者更好的是使用代码构建连接字符串来初始化上下文。 - ErikEJ
1个回答

5

所以问题是解决方案在这里创建了一个单独的.sdf文件:

"C:\Program Files (x86)\Microsoft 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 项目文件(会在“如果更新”时复制到 Debug 文件夹中)现在完全被忽略了。所有迁移都将在 Debug 文件上运行...... 这可能也是好事....

感谢 Erik 的提示! David


可以确认这也适用于使用IIS Express进行Web调试。在我的情况下,它尝试创建到“C:\Program Files(86)\IIS Express\db.sdf”。 - Jens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接