EF Code First 5.0.rc Миграции не обновляют свойство Identity

153
9

Скажем, мы используем 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 Сначала создает таблицы для нас, как ожидалось:


enter image description hereenter 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 теперь должен стать 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>

Не существует инструкций SQL, заданных в Migrations of CUsers.ID, становящихся столбцом Identity в БД. Поэтому из-за этого возникает проблема:


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


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


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


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

спросил(а) 2021-01-19T14:11:01+03:00 6 месяцев, 1 неделя назад
1
Решение
213

Я не уверен, что это ошибка, потому что есть еще одна проблема: вы не можете изменить существующий столбец на личность или удалить личность. Я могу представить, что это считается полностью ручной миграцией, чтобы было ясно, что вы должны перемещать данные.

ответил(а) 2021-01-19T14:11:01+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема