SQL Server CE代码首次迁移问题

dav*_*dhq 7 .net c# entity-framework visual-studio ef-migrations

我有一些问题试图为我的桌面.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"/>`
Run Code Online (Sandbox Code Playgroud)

因此,Add-Migration InitialMigration在管理员模式下运行后,我得到一个空迁移...没关系.然后我删除迁移并添加一个新类:

using System;
using System.Collections.Generic;

public class Blog
{
    public int ID { get; set; }
    public string Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我添加了对上下文类的引用:

public class LogoContext : DbContext
{
    public DbSet<Word> Words { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<Blog> Blogs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后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");
    }
}
Run Code Online (Sandbox Code Playgroud)

跑完后Update-Database我看到:

Applying code-based migrations: [201304211225255_InitialMigration].
Applying code-based migration: 201304211225255_InitialMigration.
Running Seed method.
Run Code Online (Sandbox Code Playgroud)

现在出现问题 - 在我的服务器资源管理器中,我检查数据库Logo.sdf,它包括表Blogs!我甚至尝试从我的应用程序运行此代码:

var db = new LogoContext();
db.Posts.Add(new Blog { Title= "moo" });
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢!大卫

dav*_*dhq 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"/>
Run Code Online (Sandbox Code Playgroud)

这引用了bin/Debug/Logo.sdf,它在开发期间和单独运行.exe时有效.

这种方式唯一的事情就是我的Logo.sdf项目文件(现在它被复制到Debug"如果更新")现在完全被忽略了.所有迁移都将在Debug文件上运行..这可能也很好....

Thanx Erik提示!大卫