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 CAddress
Haupt 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:
Also, nehmen wir an, wir einen Fehler gemacht, und in der Tat wollen wir CUser
Haupt 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)
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?
Wow, es ist eine Schande. Das wusste ich nicht. Vielen Dank für Ihre Antwort. – Roman
zurück Ticks sind keine Anführungszeichen – d512