EF Code First 5.0.rc迁移不会更新Identity属性

Rom*_*man 11 entity-framework ef-code-first ef-migrations

比如,我们正在使用EF Code First,我们有这个简单的模型:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace EFCodeFirstIdentityProblem.Models
{
    public class CAddress
    {
        public int ID { get; set; }

        public string Street { get; set; }
        public string Building { get; set; }

        public virtual CUser User { get; set; }
    }

    public class CUser
    {
        public int ID { get; set; }

        public string Name { get; set; }
        public string Age { get; set; }

        [Required]
        public virtual CAddress Address { get; set; }
    }

    public class MyContext : DbContext
    {
        public DbSet<CAddress> Addresses { get; set; }
        public DbSet<CUser> Users { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)


像这样,CAddress将是这个1:0..1关系的主要结束.接下来,我们将连接字符串添加到Web.Config(我使用MSSQL 2008 R2),制作一个使用该模型的控制器,运行.EF Code First按预期为我们创建表格:

在此输入图像描述 在此输入图像描述



所以,我们假设我们犯了一个错误,事实上我们希望CUser成为这个0..1:1关系的主要终点.所以我们做出改变:

        ...
        [Required]
        public virtual CUser User { get; set; }
        ...

        ...
        public virtual CAddress Address { get; set; }
        ...
Run Code Online (Sandbox Code Playgroud)

然后在Package Manager Console中运行并添加一些迁移:

PM> Enable-Migrations
Checking if the context targets an existing database...
Detected database created with a database initializer. Scaffolded migration '201208021053489_InitialCreate' corresponding to existing database. To use an automatic migration instead, delete the Migrations folder and re-run Enable-Migrations specifying the -EnableAutomaticMigrations parameter.
Code First Migrations enabled for project EFCodeFirstIdentityProblem.
PM> Add-Migration ChangeDependency
Scaffolding migration 'ChangeDependency'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration 201208021157341_ChangeDependency' again.
PM> 
Run Code Online (Sandbox Code Playgroud)

这里我们为"ChangeDependency"迁移提供了什么:

namespace EFCodeFirstIdentityProblem.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class ChangeDependency : DbMigration
    {
        public override void Up()
        {
            DropForeignKey("dbo.CUsers", "ID", "dbo.CAddresses");
            DropIndex("dbo.CUsers", new[] { "ID" });
            AlterColumn("dbo.CAddresses", "ID", c => c.Int(nullable: false));
            AlterColumn("dbo.CUsers", "ID", c => c.Int(nullable: false, identity: true)); //identity: true - this is important
            AddForeignKey("dbo.CAddresses", "ID", "dbo.CUsers", "ID");
            CreateIndex("dbo.CAddresses", "ID");
        }

        public override void Down()
        {
            DropIndex("dbo.CAddresses", new[] { "ID" });
            DropForeignKey("dbo.CAddresses", "ID", "dbo.CUsers");
            AlterColumn("dbo.CUsers", "ID", c => c.Int(nullable: false));
            AlterColumn("dbo.CAddresses", "ID", c => c.Int(nullable: false, identity: true));
            CreateIndex("dbo.CUsers", "ID");
            AddForeignKey("dbo.CUsers", "ID", "dbo.CAddresses", "ID");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

进口和部分是:

AlterColumn("dbo.CUsers","ID",c => c.Int(nullable:false,identity:true));

所以CUsers.ID现在必须成为DB中的Identity.让我们将此更改提交给DB:

PM> 
PM> Update-Database -Verbose
Using StartUp project 'EFCodeFirstIdentityProblem'.
Using NuGet project 'EFCodeFirstIdentityProblem'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'EFTest' (DataSource: (local), Provider: System.Data.SqlClient, Origin: Configuration).
Applying code-based migrations: [201208021157341_ChangeDependency].
Applying code-based migration: 201208021157341_ChangeDependency.
ALTER TABLE [dbo].[CUsers] DROP CONSTRAINT [FK_dbo.CUsers_dbo.CAddresses_ID]
DROP INDEX [IX_ID] ON [dbo].[CUsers]
ALTER TABLE [dbo].[CAddresses] ALTER COLUMN [ID] [int] NOT NULL
ALTER TABLE [dbo].[CUsers] ALTER COLUMN [ID] [int] NOT NULL
ALTER TABLE [dbo].[CAddresses] ADD CONSTRAINT [FK_dbo.CAddresses_dbo.CUsers_ID] FOREIGN KEY ([ID]) REFERENCES [dbo].[CUsers] ([ID])
CREATE INDEX [IX_ID] ON [dbo].[CAddresses]([ID])
[Inserting migration history record]
Running Seed method.
PM> 
Run Code Online (Sandbox Code Playgroud)

迁移的CUsers.ID没有给出DB中的标识列的SQL指令.所以,因此有一个问题:

(更新数据库) 在此输入图像描述 在此输入图像描述

因此,User现在是主要的结束,并且必须具有ID Identity:"YES"标志,但Identity仍然是"NO".而地址是依赖的结尾,必须有ID身份"NO",但仍然是"YES".所以我无法添加新的User to User表,因为没有为新实例生成新的ID.

如果我删除整个数据库,EF Code First会从头开始正确创建新表,因此这只是迁移的问题.

在这种情况下我该怎么办?这是EF迁移错误吗?

Lad*_*nka 22

我不确定它是否是一个错误,因为还有另一个问题 - 您无法将现有列更改为标识或删除标识.我可以想象这被认为是完全手动迁移,以明确您必须移动数据.