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, Boolean breakConnection, Action 1 wrapCloseInAction) at
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException
exception, Boolean breakConnection, Action
1 wrapCloseInAction) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean 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 async, Int32 timeout) в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 1
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(IEnumerable
1 migrationStatements) в System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable 1
migrationStatements) at
System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String
migrationId, XDocument targetModel, IEnumerable
1 операция, Boolean понижение, Boolean auto) при System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, исходный код XDocument, XDocument targetModel, Boolean понижение) на System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, исходный код XDocument, XDocument targetModel, Boolean понижение) на System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable 1
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". Единственный столбец с идентификатором для таблицы.
Здесь явно указана только одна колонка Identity. Так почему это так?
Когда я делаю это, я не получаю исключения.
public class NewUserRegistration
{
[Key]
public int Id { get; set; }
}
Любые мысли о том, почему это так?
ИЗМЕНИТЬ
Я должен сказать, что меняю имя ключа. В комментариях говорится, что вы не можете просто сделать это. Как я могу бросить и воссоздать?
Лучше ли удалять базу данных из SQL, а затем снова запустить команду Update-Database
?
Ответы
Ответ 1
Я столкнулся с той же ошибкой при попытке переименовать столбец Key. Чтобы выполнить миграцию, мне пришлось переупорядочить порядок операций в моей миграции лесов script.
Здесь я сначала заказывал операции 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");
}
Надеюсь, что это поможет в вашем случае.
Ответ 2
У меня также не было никаких проблем, просто заменив соответствующие команды DropPrimaryKey
, DropColumn
, AddColumn
и AddPrimaryKey
командой RenameColumn
, например
public partial class RenameKey : DbMigration
{
public override void Up()
{
RenameColumn("dbo.GameSummary", "OldId", "Id");
}
}
Ответ 3
У меня также была аналогичная проблема после моих первых миграций. Я понял, что после того, как я удалил базу данных, созданную первой миграцией, а затем удаленную папку миграции, созданную в моем приложении mvc, проблема не появилась снова.
Ответ 4
Вы можете просто изменить имя столбца непосредственно из класса, используя что-то вроде этого:
[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; }
}
}