Its*_*-me 65 entity-framework ef-migrations
我使用迁移(EF 5.0)和代码优先有一个有趣的效果:
我用GUID主键创建了一些模型.(顺便说一句:对我来说,SQL Server使用它很重要NEWSEQUENTIALID(),这似乎是当前版本中的默认值)
在某些时候,我激活了迁移.我在初始迁移中添加了一些代码,这主要是.Index()根据需要.
当我删除数据库并调用update-database时,出现以下错误:
无法更新数据库以匹配当前模型,因为存在挂起的更改并且已禁用自动迁移.将挂起的模型更改写入基于代码的迁移或启用自动迁移.将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移.您可以使用Add-Migration命令将挂起的模型更改写入基于代码的迁移.
我尝试过AutomaticMigrationsEnabled = true,无需更改或添加任何内容即可使用!
但既然我不想要AutomaticMigrationsEnabled,我也尝试再次删除数据库,update-database然后调用add-migration.我最终得到了一个似乎没有改变任何东西的额外迁移(见下文).我也尝试将这些行添加到初始迁移的底部 - 但这并没有改变任何东西.
其中一个型号:
[Table(Speaker.TABLENAME)]
public class Speaker : BaseModel
{
public const String TABLENAME = "Speaker";
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Required]
[MaxLength(50, ErrorMessage = "Name must be 50 characters or less")]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
初始迁移代码:
public partial class InitialCreate : DbMigration
{
public override void Up()
{
// [...]
CreateTable(
"dbo.Speaker",
c => new
{
Id = c.Guid(nullable: false, identity: true),
Name = c.String(nullable: false, maxLength: 50),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Name, true, false); // added manually: unique Name
// [...]
}
}
internal sealed class Configuration : DbMigrationsConfiguration<MyProject.Repositories.DBContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(MyProject.Repositories.DBContext context)
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
下面是add-migration创建的代码:它似乎没有做任何新的东西 - 也许我错过了什么?
public partial class UnneccessaryMigration : DbMigration
{
public override void Up()
{
// isn't this the exact same code from InitialMigrations?
AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false, identity: true));
// ...
}
public override void Down()
{
//...
AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false));
}
}
Run Code Online (Sandbox Code Playgroud)
所以我很好奇:我做了什么来迷失迁移?如果只使用一次初始迁移,我该怎么办呢?
解决方案:以下解决方法为我做了:
Kaf*_*Kaf 102
我还尝试再次删除数据库,称为update-database,然后添加迁移.我最终得到了一个似乎没有改变任何东西的额外迁移(见下文)
基于以上细节,我认为你先做了最后一件事.如果Update database之前运行Add-migration,则不会使用迁移模式更新数据库.首先,您需要添加迁移,然后运行update命令.
使用包管理器控制台按此顺序尝试它们.
PM> Enable-migrations //You don't need this as you have already done it
PM> Add-migration Give_it_a_name
PM> Update-database
Run Code Online (Sandbox Code Playgroud)
实体框架确实在身份字段方面存在一些问题.
迁移:不检测DatabaseGeneratedOption的更改
逆向工程不会将具有默认NEWSEQUENTIALID()的GUID键标记为存储生成的标识
这些都没有完全描述您的问题,并且额外迁移中的Down()方法很有趣,因为当初始迁移中的CREATE TABLE似乎设置它时,它似乎试图从列中删除IDENTITY!
此外,如果您使用Update-Database -Script或Update-Database -Verbose查看从这些AlterColumn方法运行的sql,您将看到sql在Up和中是相同的Down,并且实际上什么都不做.IDENTITY保持不变(对于当前版本 - EF 6.0.2及更低版本) - 如我链接的前两个问题中所述.
我认为您应该删除额外迁移中的冗余代码,并暂时使用空迁移.您可以订阅/投票支持要解决的问题.
参考文献:
| 归档时间: |
|
| 查看次数: |
128649 次 |
| 最近记录: |