我在尝试为 table 面.NET应用程序启用SQL Server Compact 4.0数据库的(代码优先)迁移时遇到了很多问题。
Enable-Migrations确实起作用,并创建了Migrations目录。之后,当我尝试运行Add-Migration InitialMigration时,我得到:



这是第一个问题,但是我是通过以管理员身份运行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了……至少是有关迁移的一些元数据,但是我仍然无法在Server Explorer中看到该表。

我正在使用VS 2012和EF 5.0。

请帮助我理解这一点...在我看来,这是严重错误的,因为它仅适用于SQL Server Express实例,但不适用于SQL Server CE 4.0。 :((

谢谢!
大卫

最佳答案

因此,问题在于该解决方案在此处创建了一个单独的.sdf文件:



真是出乎意料和奇怪的恕我直言...

我最终使用了以下连接字符串:

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

该引用bin/Debug/Logo.sdf,在开发过程中以及单独运行.exe时都可以使用。

这种方法的唯一作用是现在完全忽略了我的Logo.sdf项目文件(该文件已复制到“如果更新则调试”中)。所有迁移都将在Debug文件上运行。

谢谢埃里克(Thanx Erik)的提示!
大卫

关于c# - SQL Server CE Code First迁移问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16131193/

10-11 22:36
查看更多