Объект 'DF *' зависит от столбца ' * ' - изменение int на double
в основном я получил таблицу в моей базе данных EF со следующими свойствами:
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Image { get; set; }
public string WatchUrl { get; set; }
public int Year { get; set; }
public string Source { get; set; }
public int Duration { get; set; }
public int Rating { get; set; }
public virtual ICollection<Category> Categories { get; set; }
он отлично работает, однако, когда я изменяю int рейтинга, чтобы быть двойным, я получаю следующую ошибку при обновлении базы данных:
объект 'DF_фильмы_оценка__48CFD27E зависит от рейтинга колонка'.
Изменить таблицу изменить рейтинг столбца не удалось, так как один или несколько объектов обращаются к этому столбцу.
в чем проблема?
8 ответов:
попробуйте это:
снимите ограничение ДФ_фильмы_оценка__48CFD27E перед изменением типа поля.
ограничение обычно создается автоматически СУБД (SQL Server).
чтобы увидеть ограничение, связанное с таблицей, разверните атрибуты таблицы в обозреватель объектов, а затем категория ограничения как показано ниже:
вы должны удалить ограничение перед изменением типа поля.
Это
tsqlпутьALTER TABLE yourtable DROP CONSTRAINT constraint_name -- DF_Movies_Rating__48CFD27Eдля полноты это просто показывает комментарий @Joe Taras в качестве ответа
я добавляю это в качестве ответа, чтобы объяснить, откуда берется ограничение. Я пытался сделать это в комментариях, но там трудно красиво редактировать: -/
Если вы создадите (или измените) таблицу со столбцом, который имеет значения по умолчанию, это создаст для вас ограничение.
В таблице, например это может быть:
CREATE TABLE Movie ( ... rating INT NOT NULL default 100 )это создаст ограничение для значения по умолчанию 100.
Если вы вместо этого создадите его так
вы получите красиво названное ограничение, которое легче ссылаться, когда вы изменяете указанную таблицу.CREATE TABLE Movie ( name VARCHAR(255) NOT NULL, rating INT NOT NULL CONSTRAINT rating_default DEFAULT 100 );ALTER TABLE Movie DROP CONSTRAINT rating_default; ALTER TABLE Movie ALTER COLUMN rating DECIMAL(2) NOT NULL; -- sets up a new default constraint with easy to remember name ALTER TABLE Movie ADD CONSTRAINT rating_default DEFAULT ((1.0)) FOR rating;вы можете объединить эти последние 2 оператора, чтобы изменить столбец и назвать ограничение в одной строке (вы должны, если это существующая таблица в любом случае)
поскольку ограничение имеет непредсказуемое имя, вы можете написать специальный скрипт (DropConstraint) чтобы удалить его, не зная его имя (был протестирован в EF 6.1.3):
public override void Up() { DropConstraint(); AlterColumn("dbo.MyTable", "Rating", c => c.Double(nullable: false)); } private void DropConstraint() { Sql(@"DECLARE @var0 nvarchar(128) SELECT @var0 = name FROM sys.default_constraints WHERE parent_object_id = object_id(N'dbo.MyTable') AND col_name(parent_object_id, parent_column_id) = 'Rating'; IF @var0 IS NOT NULL EXECUTE('ALTER TABLE [dbo].[MyTable] DROP CONSTRAINT [' + @var0 + ']')"); } public override void Down() { AlterColumn("dbo.MyTable", "Rating", c => c.Int(nullable: false)); }
когда мы пытаемся отбросить столбец, который зависит от этого, мы видим такую ошибку:
объект 'DF__*' зависит от столбца ".
удалить ограничение, которое зависит от столбца с:
ALTER TABLE TableName DROP CONSTRAINT dependent_constraint;пример:
Msg 5074, Уровень 16, Состояние 1, Строка 1
объект 'ДФ__сотрудников__Colf__1273C1CD' зависит от колонки "Кольф".
Msg 4922, Уровень 16, Состояние 9, Строка 1
ALTER TABLE DROP COLUMN Colf не удалось, потому что один или несколько объектов обращаются к этому столбцу.
ограничения(ДФ__сотрудников__Colf__1273C1CD):
ALTER TABLE Employees DROP CONSTRAINT DF__Employees__Colf__1273C1CD;затем вы можете удалить столбец:
Alter Table TableName Drop column ColumnName
MS SQL Studio позаботится о том, когда вы удалите столбец, но если вам нужно Удалить Ограничение Программно вот простое решение
вот фрагмент кода, который будет отбрасывать столбец с ограничением по умолчанию:
DECLARE @ConstraintName nvarchar(200) SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__') AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns WHERE NAME = N'__ColumnName__' AND object_id = OBJECT_ID(N'__TableName__')) IF @ConstraintName IS NOT NULL EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName) IF EXISTS (SELECT * FROM syscolumns WHERE id=object_id('__TableName__') AND name='__ColumnName__') EXEC('ALTER TABLE __TableName__ DROP COLUMN __ColumnName__')просто заменить Имя_таблицы и Имя_столбца с соответствующими значениями. Вы можете спокойно работать даже если колонна уже упал.
бонус: вот код для удаления внешних ключей и других типов ограничений.
IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = '__TableName__' AND COLUMN_NAME = '__ColumnName__') BEGIN SELECT @ConstraintName = CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = '__TableName__' AND COLUMN_NAME = '__ColumnName__' EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName) END
у меня была эта ошибка при попытке выполнить миграцию чтобы обойти это, я переименовал столбец и повторно сгенерировал миграцию с помощью
add-migration migrationname -forceв консоли диспетчера пакетов. Тогда я смог бежать
update-databaseуспешно.


Comments