У меня есть сущность с именем Cost
, которая имеет обязательное свойство CostType
. Класс Cost
имеет метод GetNew()
, который устанавливает все значения по умолчанию для стоимости:
public static GetNew()
{
Cost cost = new Cost ();
foo.CostType = Lists.CostTypes.FirstOrDefault();
// Other Default Values
return foo;
}
Lists.CostTypes
- это статический список, который извлекается из EF при запуске и используется в ComboBoxes
У меня проблемы с установкой CostType в моем коде после первой установки в методе GetNew()
.
Например, следующий код читает файл Excel и задает тип по умолчанию на основе столбца в файле Excel, или ноль, если не удается найти совпадение
Cost cost = Cost.GetNew();
cost.CostType = Lists.CostTypes.FirstOrDefault(t => t.Name == row[0].ToString());
Моя проблема в том, что во время операции сохранения я получаю следующую ошибку:
Операция не выполнена: отношение не может быть изменено, так как одно или несколько свойств внешнего ключа не могут быть равны нулю.Когда в отношение вносится изменение, для соответствующего свойства внешнего ключа устанавливается нулевое значение.Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, свойству внешнего ключа должно быть назначено другое ненулевое значение или несвязанный объект должен быть удален.
MyОперация добавления выглядит следующим образом:
public static void AddObject(EntityObject obj, string entitySetName)
{
context.AddObject(entitySetName, obj);
context.SaveChanges();
}
- Если я удаляю строку кода, которая вручную устанавливает стоимость при чтении файла Excel, сохранение работает нормально.
- Если я изменю строку кода на чтение Lists.Costs [2], это сохранит нормально.
- Если я удаляю строку кода в
GetNew()
, которая устанавливает значение по умолчанию, я получаю сообщение об ошибке, сообщающее, что я нарушил правило PK CostTypes, то есть оно пытается вставить тип стоимости. - Изменение ComboBox, показывающего тип на что-то другое, все равно вызывает ту же ошибку.
- После загрузки затрат из файла excel мои обычные формы добавления / редактирования выдают ту же ошибку, когда я изменяю тип и пытаюсь сохранить.Если я не загружаю файл Excel, они работают нормально.
Я все еще изучаю Entity Framework, но до сих пор использовать его было просто разочарованием и головной болью.Кто-нибудь знает, в чем заключается моя проблема и как я могу ее исправить?
РЕДАКТИРОВАТЬ
Вот информация, запрошенная Слаумой.Я держу это простым и исключая несвязанные объекты
Costs
находятся в одной таблице и CostTypes
находятся в другой таблице.В базе данных столбец Costs.TypeId
не может быть пустым и является внешним ключом для CostTypes
.Поле Id
для обеих таблиц генерируется автоматически.
Моя модель EF - это просто общая модель с добавлением двух таблиц базы данных.Единственное изменение, которое я внес в него, - это переименовать некоторые поля и удалить CostTypes.Costs
Свойство навигации.
Файл Excel, который получает импортированные, сопоставляет большинство затрат с их соответствием CostType.Name
, однакоВозможно, что строка в файле Excel не соответствует CostType
, поэтому Lists.CostTypes.FirstOrDefault(t => t.Name == row[0].ToString()) can assign a
NULL value to the
Cost.Type property. That doesn't seem to be a problem though, because the form still comes up with the list of costs and their default selected items. Item's with a
NULL CostType do not have an item selected in the CostType
ComboBox` и вызывают ошибку проверки, которую необходимо исправить перед сохранением.
Код для загрузки списка CostType
:
public static List<T> GetList<T>(string sortProperty)
where T : EntityObject
{
using (var context = new TContext())
{
return ApplyOrder<T>(context.CreateObjectSet<T>(), sortProperty, "OrderBy").ToList();
}
}
Код ApplyOrder
можно найти здесь .
Метод GetList вызывается из
public static class Lists
{
public static List<CostType> CostTypes { get; private set; }
static Lists()
{
CostTypes = DAL<CostEntities>.GetList<CostType>("Name");
}
}