EF Code First 5.0.rc Migrations не `не обновляет свойство Identity

Скажем, мы используем 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; }
    }
}


Таким образом, CAddressбудет основным концом этого отношения 1 :0..1. Далее добавляем строку подключения в Web.Config (Я использую MSSQL 2008 R2 ), делаю контроллер, использующий эту модель, запускаю. EF Code First создает для нас таблицы, как и ожидалось :

enter image description here enter image description here



. Итак, давайте предположим, что мы допустили ошибку, и на самом деле мы хотим, чтобы CUserбыло основным концом этого 0..1 :1 отношения. Итак, вносим изменения:

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

       ...
        public virtual CAddress Address { get; set; }
       ...

Соберите, затем запустите в консоли диспетчера пакетов и добавьте миграцию:

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> 

Вот что мы `получили для миграции "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");
        }
    }
}

Важная часть:

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

Таким образом, CUsers.ID теперь должен стать идентификатором в БД. Давайте зафиксируем эти изменения в БД:

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> 

Инструкции SQL, данные Миграцией CUsers.ID, становятся столбцом Identity в БД. Так вот, из-за этого возникает проблема:

(обновленная база данных) enter image description here enter image description here

Таким образом, пользователь теперь является основным концом и должен иметь флаг ID Identity :«YES», но Identity по-прежнему «NO». И адрес является зависимым концом, должен иметь идентификатор «НЕТ», но все еще «ДА». Поэтому я не могу добавить нового пользователя в таблицу пользователей, потому что новый идентификатор не создается для нового экземпляра.

Если я удаляю всю базу данных, EF Code First правильно создает новые таблицы с нуля, так что это проблема только миграции.

Что мне делать в этой ситуации? Это ошибка миграции EF?

11
задан Roman 2 August 2012 в 12:41
поделиться