2012-11-25 2 views
13

sto creando questo modello come parte del mio codice prima Entity FrameworkEntity Framework 5 Colonne di identità multiple specificate per la tabella. È consentita una sola colonna di identità per ogni tabella

public class NewUserRegistration 
{ 
    [Key] 
    public int NewUserRegistrationId { get; set; }  
} 

Utilizzando il comando Update-Database -Verbose -Force nel pacchetto Manger ConsoleI ottenere questa eccezione durante il questo bit dell'aggiornamento Applying automatic migration: 201211252223088_AutomaticMigration. .

ALTER tABLE [dbo] [NewUserRegistration] ADD [NewUserRegistrationId] [int] NOT NULL System.Data.SqlClient.SqlException iDENTITÀ (0x80131904): colonne di identità multiple specificati per la tabella 'NewUserRegistration'. È consentita una sola colonna Identity per tabella. a System.Data.SqlClient.SqlConnection.OnError (eccezione SqlException, breakConnection booleano, Azione 1 1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action wrapCloseInAction) a System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj, booleano callerHasConnectionLock, booleano asyncClose) a sistema. Data.SqlClient.TdsParser.TryRun (runBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader datastream, bulkCopyHandler BulkCopySimpleResultSet, TdsParserStateObject stateObj, booleano & dataReady) a System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds (String methodName, async booleano, Int32 timeout) a S ystem.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (TaskCompletionSource migrationStatements) a System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements (IEnumerable 1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable 1 operazioni, booleano declassamento, auto booleano) a System.Data. Entity.Migrations.DbMigrator.AutoMigrate (String migrationId, XDocument sourceModel, XDocument targetModel, booleano downgrading) a System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate (String migrationId, XDocument sourceModel, XDocument targetModel, booleano declassamento) a System.Data.Entity.Migrations.DbMigrator.Upgrade (IEnumerable pendingMigrations, String targetMigrationId, String lastMigrationId)
a System.Data.Entity.Migrations.DbMigrator.Update (String targetMigration) a System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update (String targetMigration) a System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore() a System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run() ClientConnectionId: a39395da-5f2b-48e0-BDAC-b48d75a68c68 Più colonne di identità specificate per la tabella "NewUserRegistration". È consentita una sola colonna Identity per tabella.

C'è chiaramente una sola colonna di identità specificata. Allora, perché è così?

Quando faccio questo non ottengo eccezione.

public class NewUserRegistration 
{ 
    [Key] 
    public int Id { get; set; }  
} 

Qualche idea sul perché questo è il caso?

EDIT

Devo dire che sto cambiando il nome della chiave. I commenti dicono che non puoi farlo solo Come posso abbandonare e ricreare?

È meglio eliminare il database da SQL e quindi eseguire nuovamente il comando Update-Database?

+1

Sembra che si sta cambiando tabella esistente. Hai avuto altra chiave nell'entità prima di aver aggiunto "NewUserRegistrationId'? Le colonne di identità non possono essere semplicemente cambiate. –

+0

sì, quindi come faccio a istruire la cosa a rilasciare e ricreare la tabella. – Peter

risposta

62

Ho riscontrato lo stesso errore durante il tentativo di rinominare una colonna Chiave. Per far funzionare la migrazione, ho dovuto riordinare l'ordine delle operazioni nel mio script di migrazione scaffolded.

Qui, mi sono assicurato di ordinare prima le operazioni di rilascio, quindi ho aggiunto il nuovo campo Chiave in seguito.

public partial class RenameKey : DbMigration 
{ 
    public override void Up() 
    { 
     DropPrimaryKey("dbo.GameSummary", new[] { "OldId" }); 
     DropColumn("dbo.GameSummary", "OldId"); 
     AddColumn("dbo.GameSummary", "Id", c => c.Int(nullable: false, identity: true)); 
     AddPrimaryKey("dbo.GameSummary", "Id"); 
    } 

Spero che ti aiuti con il tuo caso.

+5

Si potrebbe pensare che DropPrimaryKey sarebbe sufficiente. Quando riordinate il codice, assicuratevi che DropPrimaryKey e DropColumn si presentino prima di AddColumn con il metodo di tipo ColumnBuilder che include identity: true. –

+0

Ma questo non funziona con i dati esistenti nella colonna OldId, giusto? – Elisabeth

+0

sì, non funziona con i dati esistenti –

5

Inoltre non avuto alcun problema semplicemente sostituendo i relativi comandi DropPrimaryKey, DropColumn, AddColumn e AddPrimaryKey con un comando RenameColumn, ad esempio

public partial class RenameKey : DbMigration 
{ 
    public override void Up() 
    {  
     RenameColumn("dbo.GameSummary", "OldId", "Id"); 
    } 
} 
+0

Ottima risposta. Può essere un modo elegante per gestire i dati esistenti. – Irwin

2

Ho anche avuto un problema simile dopo le mie prime migrazioni. Quello che ho capito è che dopo aver eliminato il database che la prima migrazione ha creato e quindi rimosso la cartella migrazioni creata nella mia applicazione mvc, il problema non si è presentato più.

1

Si può solo cambiare il nome della colonna direttamente dalla classe utilizzando qualcosa di simile a questo:

[Column("ProductID")] 

Esempio:

namespace Z_Market.Models 
{ 
    public class Product 
    { 
     [Key, Column("ProductID")] //This change the name of the column when you are using migration. If you have a form created already, you have to change the connection in the for to aim the new column name. 
     public int ID { get; set; } 
     public string Description { get; set; } 
     public decimal Price { get; set; } 
     public DateTime LastBuy { get; set; } 
     public float Stock { get; set; } 
     public string remarks { get; set; } 
     public string deleteme { get; set; } 

     public ICollection<SupplierProduct> SupplierProducts { get; set; } 
    } 
} 
+0

Questa risposta è per EF5 o EF6? – Peter