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();

检查我的服务器资源管理器是否没有显示表格..但我得到一个例外:

指定的表不存在。[ 博客 ]

所以迁移显然没有应用于我的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。:((

谢谢!大卫

4

1 回答 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 “如果更新”)现在完全被忽略了。所有迁移都将在调试文件上运行.. 这可能也很好....

感谢 Erik 的提示!大卫

于 2013-04-21T20:16:16.533 回答