标签: ef-migrations

无法在类库中启用Entity Framework的迁移

我刚刚加入了EF 5并使用了他们的代码优先迁移工具,但是当我尝试启用迁移时,我似乎遇到了错误.

我输入Enable-Migrations包管理器控制台,然后说

没有从当前项目中找到的DbContext派生的类.
编辑生成的Configuration类以指定启用迁移的上下文.
为项目MyApp.MvcUI启用了代码优先迁移.

然后它在我的MvcUI项目中创建一个Migrations文件夹和一个Configuration类.事实上,我的DbContext存在于名为MyApp.Domain的类库项目中.它应该在该项目中完成所有这一切,并且应该没有问题找到我的DbContext.

c# entity-framework ef-code-first ef-migrations entity-framework-5

43
推荐指数
2
解决办法
2万
查看次数

EF5迁移更新 - 数据库 - 脚本错误

我一直在使用带有试用许可证的Visual Studio 2012 RC,没有任何问题.我昨天购买了Visual Studio 2012 Professional,安装了最新版本,并安装了Update 1.

我有一个我已经工作多年的解决方案/项目.它有许多迁移.我跑了第一个add-migration TableX_NewFieldupdate-database -sourcemigration:TableX_PreviousNewField最新版本.

他们都跑了没有问题.

然后我跑了update-database -script -sourcemigration:TableX_PreviousNewField并收到以下内容:

PM> update-database -script -sourcemigration:TableX_PreviousNewField
Applying code-based migrations: [201301151003149_TableX_NewField].
Applying code-based migration: 201301151003149_TableX_NewField.
System.Runtime.InteropServices.COMException (0x8004000C): User canceled out of save dialog (Exception from HRESULT: 0x8004000C (OLE_E_PROMPTSAVECANCELLED))
  at EnvDTE.ItemOperations.OpenFile(String FileName, String ViewKind)
  at System.Data.Entity.Migrations.Utilities.DomainDispatcher.OpenFile(String fileName)
  at System.Data.Entity.Migrations.Utilities.DomainDispatcher.OpenFile(String fileName)
  at System.Data.Entity.Migrations.Extensions.ProjectExtensions.NewSqlFile(Project project, String contents)
  at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
  at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
User canceled out of save dialog (Exception from HRESULT: 0x8004000C (OLE_E_PROMPTSAVECANCELLED))
Run Code Online (Sandbox Code Playgroud)

我已经运行了Windows更新.使用NuGet检查更新.重新启动了我的电脑.仍然有错误.

entity-framework ef-migrations entity-framework-5

43
推荐指数
1
解决办法
8334
查看次数

对EF自动迁移和播种的困惑 - 为每个程序启动播种

我最近更改了一个应用程序,使用以下内容开发:

DropCreateDatabaseIfModelChanges<Context>
Run Code Online (Sandbox Code Playgroud)


使用:

public class MyDbMigrationsConfiguration: DbMigrationsConfiguration<GrsEntities>
{
    public MyDbMigrationsConfiguration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
    }
}
Run Code Online (Sandbox Code Playgroud)


在我的db上下文中,我有:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // Tell Code First to ignore PluralizingTableName convention
    // If you keep this convention then the generated tables will have pluralized names.
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    //set the initializer to migration
    Database.SetInitializer(new MigrateDatabaseToLatestVersion<GrsEntities, MigrationConfig>());
}
Run Code Online (Sandbox Code Playgroud)

我在DbMigrationsConfiguration中使用AddOrUpdate扩展覆盖了种子(上下文),我刚刚在drop db(DropCreateDatabaseIfModelChanges)上播种时使用了Add.

我的困惑是,无论DbContext是否有任何更改,迁移都会在应用程序的每次启动时运行.每次启动应用程序(库通过服务运行)时,初始化程序都会像Seed一样运行.我的预期行为是检查是否需要迁移(在幕后检查模型是否与物理数据库匹配)然后更新任何新的/删除的表/列,并且只有在某些内容发生更改时才运行种子.

在我的测试种子每次运行,这是可行但看似效率低,并不是我所期望的.不幸的是,MSDN文档非常有限.

我是否完全滥用MigrateDatabaseToLatestVersion?有没有办法获得我期望的行为(即只有种子,如果有模型更改)或者我应该只更改我的种子方法,以期在每次应用程序启动时运行?

entity-framework ef-code-first ef-migrations entity-framework-4.3

42
推荐指数
2
解决办法
2万
查看次数

在迁移中更改数据Up方法 - 实体框架

我在现有模型中添加了一个新属性.它是一个bool属性,默认值为true.此表中存在现有数据,我想在Up方法中创建新字段后立即将一个特定行的新属性设置为false.

public override void Up()
    {
        AddColumn("dbo.RequestValidationErrors", "IsBreaking", c => c.Boolean(nullable: false));
        using (Context ctx = new Context())
        {
            var validation = ctx.RequestValidationErrorSet.FirstOrDefault(x => x.WordCode == "RequestValidationError.MoreThanOneItemFound");
            if (validation != null)
            {
                validation.IsBreaking = false;
                ctx.SaveChanges();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这样,EF在说话时会抛出错误

System.InvalidOperationException:自创建数据库以来,支持'DbContext'上下文的模型已更改.考虑使用Code First Migrations来更新数据库

是否可以在此更改数据库,还是应该在其他地方更改数据库?

c# asp.net-mvc entity-framework ef-migrations

42
推荐指数
3
解决办法
3万
查看次数

是否可以更改EF Migrations"Migrations"文件夹的位置?

默认情况下,add-migration命令尝试在其中创建迁移.cs文件

  • 项目根
    • 迁移

我想将我的迁移以及其余的EF相关代码存储在我项目的\ Data文件夹中:

  • 项目根
    • 数据
      • 迁移

有了这个结构,当我执行时

PM> add-migration Migration1
Run Code Online (Sandbox Code Playgroud)

在NuGet控制台中,我收到以下错误:

    System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\MyProjectRoot\Migrations\201112171635110_Migration1.cs'.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
   at System.IO.StreamWriter.CreateFile(String path, Boolean append)
   at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize) …

entity-framework-4 ef-migrations

41
推荐指数
2
解决办法
1万
查看次数

在Entity Framework 4.3中逐步种子数据的最佳方法

我一直在现有数据库上使用Entity Framework 4.3,我有几个我想要满足的场景.

首先,如果我删除我的数据库,我希望EF从头开始重新创建 - 我已成功使用CreateDatabaseIfNotExists数据库初始化程序.

其次,如果我更新我的模型并且数据库已经存在,我希望数据库自动更新 - 我已成功使用Entity Framework 4.3 Migrations.

所以这是我的问题.假设我在模型中添加了一个新表,这需要一些参考数据,这是确保在数据库intialiser运行时以及迁移运行时创建此数据的最佳方法.我的愿望是,当我从头开始创建数据库时,以及当数据库因迁移运行而更新时,会创建数据.

在一些EF迁移示例中,我看到人们在迁移的UP方法中使用SQL()函数来创建种子数据,但如果可能,我宁愿使用上下文来创建种子数据(正如您在大多数数据库初始化示例中看到的那样)因为我觉得很奇怪,当EF的整个想法抽象出来时,你会使用纯粹的SQL.我曾尝试在UP方法中使用上下文,但出于某种原因,当我尝试在创建表的调用下直接添加种子数据时,它并不认为迁移中创建的表存在.

任何智慧都非常感激.

entity-framework ef-migrations entity-framework-4.3

41
推荐指数
2
解决办法
3万
查看次数

C#Code-First迁移,上/下?

开始在包管理器控制台中使用add-migration命令为我的模型生成迁移.我的问题是,上下方法.我假设down方法的目的是删除所有依赖项并删除表,如果它们已经在数据库中?还有up方法会在up方法之前执行吗?那么up方法是反向的,创建/更新表/索引等?

有时当我使用它时,down方法会获得许多创建表,然后被删除?最近它创建并删除了很多表,并且在up方法中几乎发生了同样的事情.为什么?

c# entity-framework code-first ef-migrations

41
推荐指数
2
解决办法
4万
查看次数

如何运行Configuration类的迁移的Seed()方法

我有两个问题:

1)如何在没有更新数据库模型的情况下从包管理器控制台运行Seed()方法?

2)有没有办法在代码中调用Seed()方法?

感谢任何建议.

c# entity-framework code-first ef-migrations

41
推荐指数
3
解决办法
3万
查看次数

实体框架 - 迁移 - 代码优先 - 每次迁移播种

我正在研究迁移,以便清理我们的部署过程.将更改推向生产时所需的人工干预越少越好.

我在迁移系统中遇到了3个主要障碍.如果我无法找到一个干净的方式,他们是显示塞子.

1.如何为每次迁移添加种子数据:

我执行命令"add-migration",它使用Up和Down函数来构建一个新的迁移文件.现在,我想通过Up和Down更改自动更改数据.我不希望将种子数据添加到Configuration.Seed方法,因为它运行所有以各种重复问题结束的迁移.

2.如果无法满足上述要求,我该如何避免重复?

我有一个枚举,我循环,以将值添加到数据库.

foreach(var enumValue in Enum.GetValues(typeof(Access.Level)))
{
    context.Access.AddOrUpdate(
        new Access { AccessId = ((int)enumValue), Name = enumValue.ToString() }
    );
}
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

即使我使用的是AddOrUpdate,我仍然会在数据库中获得重复项.上面的代码将我带到了第三个也是最后一个问题:

3.如何为主键提供种子?

我用以上代码列举的是:

public class Access
{
    public enum Level
    {
        None = 10,
        Read = 20,
        ReadWrite = 30
    }
    public int AccessId { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我指定了我想要的值作为我的主键,但实体框架似乎忽略了它.他们最终仍然是1,2,3.我怎么能得到10,20,30?

目前这些EF的局限性还是有意限制,以防止我没有看到的其他类型的灾难?

c# entity-framework seeding .net-4.5 ef-migrations

40
推荐指数
2
解决办法
3万
查看次数

EF5代码优先 - 使用迁移更改列类型

我是EF5 Code First的新手,在开始工作项目之前,我正在修改概念验证.

我最初创建了一个看起来像的模型

public class Person {
  public int Id { get; set; }
  public string FirstName { get; set;}
  public string Surname {get;set;}
  public string Location {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

我添加了一些记录,使用了一个我坚持在顶部的MVC应用程序.

现在我想将Location列更改为枚举,如:

public class Person {
  public int Id { get; set; }
  public string FirstName { get; set;}
  public string Surname {get;set;}
  public Locations Location {get;set;}
}

public enum Locations {
  London = 1,
  Edinburgh = 2,
  Cardiff = 3
}
Run Code Online (Sandbox Code Playgroud)

当我添加新的迁移时,我得到:

AlterColumn("dbo.People", "Location", c => c.Int(nullable: false));
Run Code Online (Sandbox Code Playgroud)

但是当我运行update-database时出现错误 …

c# ef-code-first ef-migrations entity-framework-5

37
推荐指数
2
解决办法
2万
查看次数