У меня есть модель, и у меня возникают проблемы при управлении отношениями с использованием структуры сущностей 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()
Я не уверен, почему думает, что здесь есть нулевое ограничение. Я не указал поля, обязательные для заполнения.