Как удалить дочерние сущности в отношении InverseProperty, используя кодовую структуру первых сущностей 4.1 - PullRequest
0 голосов
/ 12 августа 2011

У меня есть модель, и у меня возникают проблемы при управлении отношениями с использованием структуры сущностей 4.1

Здесь модель (упрощенная):

    public class UserConfig {
        [Key]
        [Column("id", TypeName = "bigint")]
        public long Id { get; set;}

        [InverseProperty("UserConfigId")]
        public virtual List<ColumnConfig> ColumnConfigs { get; set; }
    }

    public class ColumnConfig {
        [Key]
        [Column("id", TypeName = "bigint")]
        public long Id { get; set; }

        [Column("user_config_id", TypeName = "bigint")]
        public long UserConfigId { get; set; }

        [Column("width", TypeName = "int")]
        public int Width{ get; set; }

        [Column("col_name", TypeName = "varchar")]
        public string ColumnName{ get; set; }
    }

Модель представляет пользователя и пользовательское представление таблицы данных в пользовательском интерфейсе. Они изменяют размер столбцов так, как они хотят, а затем сохраняют свои настройки. У меня есть веб-сервис, который принимает список столбцов, которые они хотят, и их соответствующие ширины.

Проблема, с которой я сталкиваюсь, заключается в обновлении колонки пользователя в моем веб-сервисе. Веб-сервис не получает идентификаторы ColumnConfig, поэтому мой подход заключается в том, чтобы сначала попытаться удалить все существующие столбцы ColumnConfigs для пользователя, а затем создать новый набор объектов в соответствии с переданными новыми значениями.

Мне не удается удалить ни один из объектов ColumnConfig. Вот мой код:

public void UpdateUserConfig(UserConfig uc) {

    UserConfig origUserConf = ctx.ColumnConfigs.Find(new object[] {uc.Id});

        origUserConf.ForEach(uc => ctx.ColumnConfigs.Remove(uc));  // remove old

        origUserConf.ColumnConfigs = uc.ColumnConfigs;   // add new

    ctx.SaveChanges();  
}

Это не работает, выдает ошибку:

System.InvalidOperationException: The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
at System.Data.Entity.DbContext.SaveChanges()

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

1 Ответ

0 голосов
/ 12 августа 2011

Самый простой способ удалить дочерние отношения - это вызвать:

origUserConfig.ColumnConfigs.Clear();

К сожалению, это не сработает для вас по двум причинам: (1) у вас нет-nullable отношения, определенные между вашей родительской и дочерней сущностью, и (2) даже если отношение было определено как nullable, оно осиротит ребенка, а не удалит его.в EF4 ), чтобы получить представление о том, как EF обрабатывает удаление дочерних объектов.В вашем случае вы попадаете под случай № 1.

Поскольку полученная ошибка изменяет ваш foreach на использование метода ForEach из класса List<T>:

origUserConf.ColumnConfigs.ForEach(col => ctx.ColumnConfigs.Remove(col))
...