我有一堆问题试图为我的桌面.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。 :((
谢谢 大卫
建议你开始在连接字符串中有数据库文件的完整路径,我的猜测是你有数据库文件的多个副本,例如在你的bin/debug文件夹中 – ErikEJ 2013-04-21 13:33:13
嗯我也想过这个,但我“确保”VS正在通过删除bin/Debug版本来访问正确的Logo.sdf ......我从来没有用绝对路径测试过它,因为我排除了可能在某处存在第三个数据库副本的选项。 ..在那里,它是,在“C:\ Program Files文件(x86)\微软Visual Studio 11.0 \ Common7 \ IDE \ Logo.sdf”...好,这样神秘解决 - 谢谢..所以我真的有使用文件的绝对路径?当我编译解决方案时,编译的应用程序的配置文件还包含一个绝对路径,这是不好的...? – davidhq 2013-04-21 13:54:23
在开发过程中使用完整路径,或者使用您在代码中构建的连接字符串更好地初始化上下文。 – ErikEJ 2013-04-21 17:36:12