Объект '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 зависит от рейтинга колонка'.
Изменить таблицу изменить рейтинг столбца не удалось, так как один или несколько объектов обращаются к этому столбцу.



в чем проблема?

655   8  

8 ответов:

попробуйте это:

снимите ограничение ДФ_фильмы_оценка__48CFD27E перед изменением типа поля.

ограничение обычно создается автоматически СУБД (SQL Server).

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

Tree of your table

вы должны удалить ограничение перед изменением типа поля.

Это 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

устранение :

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

screenshot

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

    Ничего не найдено.