2012-08-02 3 views
11

Sag mal, wir sind mit EF-Code Erste und wir haben dieses einfache Modell:EF-Code Erste 5.0.rc Migrations doesn `t Update Eigenschaft Identität

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; } 
    } 
} 


Wie dies würde CAddressHaupt Ende sein von dieser 1: 0..1 Beziehung. Als nächstes fügen wir Verbindungszeichenfolge zu Web.Config hinzu (ich benutze MSSQL 2008 R2), mache einen Controller, der dieses Modell benutzt, laufe. EF-Code Zuerst erstellt Tabellen für uns wie erwartet:

enter image description here enter image description here



Also, nehmen wir an, wir einen Fehler gemacht, und in der Tat wollen wir CUserHaupt Ende davon zu sein 0..1: 1 Beziehung. So machen wir Änderungen:

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

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

gebaut, dann in Package Manager-Konsole ausführen und fügen Sie einige Migration:

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> 

Hier ist, was für "ChangeDependency" Migration gegeben Wir `ve worden:

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"); 
     } 
    } 
} 
Teil

Importand ist:

AlterColumn ("dbo.CUsers", "ID", c => c.Int (NULL festlegbaren: false, Identität: wahr));

Also CUsers.ID muss jetzt Identität in der DB werden. Lassen Sie sich verpflichten, dies zu DB ändert:

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> 

Es gibt keine SQL-Anweisungen gegeben durch Migrationen von CUsers.ID immer Identitätsspalte in DB. Also, es aus diesem Grunde ist ein Problem:

(aktualisierte Datenbank) enter image description here enter image description here

So Mitglied ist Haupt Ende jetzt, und hat ID Identität haben: „JA“ Flagge, aber Identität ist nach wie vor "NEIN". Und Adresse ist abhängig Ende, muss ID Identität "NEIN" haben, ist aber immer noch "JA". Daher kann ich keine neue Benutzer-zu-Benutzer-Tabelle hinzufügen, da für eine neue Instanz keine neue ID generiert wird.

Wenn ich die gesamte Datenbank lösche, erstellt EF Code First neue Tabellen von Grund auf neu, also ist dies nur ein Problem von Migrationen.

Was mache ich in dieser Situation? Ist dieser EF Migration Bug?

Antwort

22

Ich bin mir nicht sicher, ob es ein Fehler ist, weil es ein anderes Problem gibt - Sie cannot alter existing column to identity or remove identity. Ich kann mir vorstellen, dass dies als vollständig manuelle Migration betrachtet wird, um deutlich zu machen, dass Sie Daten verschieben müssen.

+1

Wow, es ist eine Schande. Das wusste ich nicht. Vielen Dank für Ihre Antwort. – Roman

+1

zurück Ticks sind keine Anführungszeichen – d512

Verwandte Themen