Entity Framework 5 Для таблицы указано несколько столбцов идентификации. Допускается только один столбец идентификаторов на таблицу.

Я создаю эту модель как часть моего кода первой сущности.

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

Используя команду Update-Database -Verbose -Force в консоли диспетчера пакетов, я получаю это исключение во время этого бита обновления Applying automatic migration: 201211252223088_AutomaticMigration.

ALTER TABLE [dbo].[NewUserRegistration] ADD [NewUserRegistrationId] [int] NOT NULL IDENTITY System.Data.SqlClient.SqlException (0x80131904): для таблицы NewUserRegistration указано несколько столбцов идентификаторов. Допускается только один столбец идентификаторов на таблицу. в System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое значение breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj, логическое значение callerHasConnectionLock, логическое значение asyncClose) в System.Data.SqlClient.TdsParser.TryRun (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) в System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean asyncq, IntternalNCommandInQueryl timeout) в System.Data.Sk TaskCompletionSource1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable1 migrationStatements) в System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(операции IEnumerable1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable1, логическое понижение версии, логическое автоматическое) в System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetMode l, логическое понижение версии) в System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, логическое понижение версии) в System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable
1 pendingMigrations, String targetMigrationId , String lastMigrationId)
в System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) в System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration) в System.Data.Entity.Migrations. Design.ToolingFacade.UpdateRunner.RunCore() в System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run() ClientConnectionId:a39395da-5f2b-48e0-bdac-b48d75a68c68 Для таблицы NewUserRegistration указано несколько столбцов идентификации. Допускается только один столбец идентификаторов на таблицу.

Очевидно, что указан только один столбец идентификаторов. Так почему же это так?

Когда я делаю это, я не получаю никаких исключений.

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

Любые мысли о том, почему это так?

ИЗМЕНИТЬ

Я должен сказать, что я меняю имя ключа. Комментарии говорят, что вы не можете просто так сделать. Как я могу удалить и воссоздать?

Лучше всего удалить базу данных из SQL, а затем снова запустить команду Update-Database?


person Peter    schedule 25.11.2012    source источник
comment
Похоже, вы меняете существующую таблицу. Был ли у вас другой ключ в объекте до того, как вы добавили NewUserRegistrationId? Столбцы идентификаторов нельзя просто изменить.   -  person Ladislav Mrnka    schedule 26.11.2012
comment
да, так как же мне дать указание удалить и воссоздать таблицу.   -  person Peter    schedule 27.11.2012


Ответы (6)


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

Здесь я сначала упорядочил операции Drop, а затем добавил новое поле Key.

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

Надеюсь, это поможет в вашем случае.

person Jordan    schedule 04.02.2013
comment
Можно подумать, что DropPrimaryKey будет достаточно. При изменении порядка кода убедитесь, что и DropPrimaryKey, и DropColumn предшествуют AddColumn с методом типа ColumnBuilder, который включает в себя identity: true. - person J Burnett; 25.02.2014
comment
Но это не работает с существующими данными в столбце OldId, верно? - person Elisabeth; 30.03.2016
comment
Странно, что EF не предвидит этого, и вам нужно сделать это вручную. - person Vladyslav Babych; 29.12.2016
comment
Я предоставил ответ 13 марта 2014 года, который позволяет избежать потери существующих данных. - person ADBailey; 20.07.2017

У меня также не было проблем с простой заменой соответствующих команд DropPrimaryKey, DropColumn, AddColumn и AddPrimaryKey командой RenameColumn, например

public partial class RenameKey : DbMigration
{
    public override void Up()
    {    
        RenameColumn("dbo.GameSummary", "OldId", "Id");
    }
}
person ADBailey    schedule 13.03.2014
comment
Отличный ответ. Может быть изящным способом работы с существующими данными. - person Irwin; 03.03.2018

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

person bafrimpong    schedule 19.03.2016

сначала Add-Migration -Name потом

public override void Up()
{    
    RenameColumn("dbo.Department", "OldId", "NewId");
}
person Milad    schedule 20.08.2018

Вы можете просто изменить имя столбца прямо из класса, используя что-то вроде этого:

[Column("ProductID")]

Пример:

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; }
    }
}
person Ismael Moreno    schedule 19.10.2017
comment
Это ответ для EF5 или EF6? - person Peter; 25.10.2017

Лучшими реализациями были:

/*Replace*/
DropPrimaryKey("dbo.GameSummary", new[] { "OldId" });
DropColumn("dbo.GameSummary", "OldId");
AddColumn("dbo.GameSummary", "Id", c => c.Int(nullable: false, identity: true));
AddPrimaryKey("dbo.GameSummary", "Id");
/*For*/
RenameColumn("dbo.GameSummary", "OldId", "Id");
person mariobot    schedule 28.02.2020