2012-11-25 10 views
13

tworzę ten model jako część mojego kodu pierwszego Entity FrameworkEntity Framework 5 Wiele kolumn tożsamości określonych dla tabeli. Tylko jest dozwolona jedna kolumna tożsamości za stołem

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

pomocą polecenia Update-Database -Verbose -Force w Pakiecie Manger ConsoleI uzyskać ten wyjątek podczas tego kawałka aktualizacji Applying automatic migration: 201211252223088_AutomaticMigration. .

ALTER TABLE [dbo] [NewUserRegistration] Dodano [NewUserRegistrationId] [int] NOT NULL IDENTITY System.Data.SqlClient.SqlException (0x80131904): Wiele kolumny tożsamości określone dla tabeli "NewUserRegistration". Dozwolona jest tylko jedna kolumna tożsamości na tabelę. w System.Data.SqlClient.SqlConnection.OnError (wyjątkiem SQLException, logicznego breakConnection, działania 1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction) w System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj, logiczna callerHasConnectionLock, logiczna asyncClose) w System. Data.SqlClient.TdsParser.TryRun (runBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader datastream BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, logiczna & DATAREADY) w System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds (ciąg methodName, logiczna asynchronicznymi Int32 timeout) pod adresem S. ystem.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (TaskCompletionSource migrationStatements) w System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements (IEnumerable 1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable 1 operacje Boolean Obniżanie, Boolean auto) w System.Data. Entity.Migrations.DbMigrator.AutoMigrate (String migrationId, XDocument sourceModel, XDocument targetModel, Boolean obniżenia) na System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate (String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading) pod adresem System.Data.Entity.Migrations.DbMigrator.Upgrade (IEnumerable pendingMigrations, łańcuch targetMigrationId, String lastMigrationId)
w System.Data.Entity.Migrations.DbMigrator.Update (ciąg targetMigration) w System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update (ciąg targetMigration) w System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore ()() przy System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run ClientConnectionId: a39395da-5f2b-48e0-bdac-b48d75a68c68 Wiele kolumn tożsamości określonych dla tabeli "NewUserRegistration". Dozwolona jest tylko jedna kolumna identyfikacyjna na tabelę.

Wyraźnie podano tylko jedną kolumnę tożsamości. Dlaczego tak się dzieje?

Kiedy to robię, nie mam wyjątków.

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

Wszelkie uwagi na temat tego, dlaczego tak się dzieje?

EDIT

muszę powiedzieć, że jestem zmieniając nazwę klucza. Komentarze mówią, że nie możesz tego po prostu zrobić. Jak mogę upuścić i odtworzyć?

Czy najlepiej usunąć bazę danych z SQL, a następnie ponownie uruchomić komendę Update-Database?

+1

wygląda zmieniasz istniejącą tabelę. Czy przed dodaniem 'NewUserRegistrationId' masz inny klucz w obiekcie? Kolumn tożsamości nie można po prostu zmienić. –

+0

tak, więc jak mam polecić, aby upuścić i odtworzyć stół. – Peter

Odpowiedz

62

Napotkano ten sam błąd podczas próby zmiany nazwy kolumny klucza. Aby migracja działała, musiałem zmienić kolejność operacji w moim skrypcie migracyjnym.

Tutaj, upewniłem się najpierw zamówić operacje upuszczania, a następnie dodałem nowe pole klucza.

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

Nadzieję, że pomaga w przypadku.

+5

Można by pomyśleć, że DropPrimaryKey będzie wystarczający. Zmieniając kolejność kodu, upewnij się, że zarówno DropPrimaryKey i DropColumn występują przed AddColumn z metodą typu ColumnBuilder, która zawiera tożsamość: true. –

+0

Ale to nie działa z istniejącymi danymi w kolumnie OldId, prawda? – Elisabeth

+0

Tak, to nie działa z istniejącymi danymi. –

5

ja też nie miałem żadnego problemu po prostu zastąpienie odpowiednich DropPrimaryKey, DropColumn, AddColumn i AddPrimaryKey polecenia z poleceniem, np RenameColumn

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

Świetna odpowiedź. Może być wdzięcznym sposobem radzenia sobie z istniejącymi danymi. – Irwin

2

Miałem także podobny problem po pierwszych moich migracjach. Zdałem sobie sprawę, że po usunięciu bazy danych, którą utworzyła pierwsza migracja, a następnie usunięto folder migracji utworzony w mojej aplikacji mvc, problem nie pojawił się ponownie.

1

można po prostu zmienić nazwę kolumny bezpośrednio z klasy za pomocą czegoś takiego:

[Column("ProductID")] 

Przykład:

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

Czy ta odpowiedź dotyczy EF5 lub EF6? – Peter

Powiązane problemy