Получение "невозможно вставить NULL в (" схема "." Таблица "." Столбец "), когда столбец не равен NULL
Всякий раз, когда я пытаюсь создать новый myObj в mySchema, он постоянно сообщает мне, что ID равен null, но когда я запускаю отладчик, отладчик сообщает мне, что добавляемый объект не имеет значений NULL. Это работает на машине моего коллеги, но не на моей...
MyObj myObj = new myObj() {
ID = 1234,
}
container.AddObject("MyObj", myObj);
container.ObjectStateManager.ChangeObjectState(myObj, System.Data.EntityState.Added);
// container extends ObjectContext as created by the EDMX
Это ошибка, которую я получаю:
---------------------------
---------------------------
System.Data.UpdateException: An error occurred while updating the entries. See the inner exception for details. ---> Oracle.DataAccess.Client.OracleException: ORA-01400: cannot insert NULL into ("myModel"."myObj"."ID")
ORA-06512: at line 4
at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, Boolean bCheck)
at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior)
at Oracle.DataAccess.Client.OracleCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues)
at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
--- End of inner exception stack trace ---
at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
at System.Data.Objects.ObjectContext.SaveChanges()
---------------------------
OK
---------------------------
4 ответа
Когда я в конце концов посмотрел на файл EDMX, я заметил, что для StoreGeneratedPattern было установлено значение Identity, что препятствовало передаче ID с наследованием от дочернего класса при его сохранении в базе данных через Entity-Framework.
В вашей модели Entity Framework необходимо указать, что БД не генерирует ключ для вас, а EF должна использовать предоставленный вами ключ!
modelBuilder.Entity<Department>().Property(t => t.DepartmentID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
См. Источник: http://msdn.microsoft.com/en-us/data/jj591617.aspx
Надеюсь, что это помогает другим, которые находят эту тему!
У меня была проблема с структурой сущностей, не устанавливающей storeGeneratedPattern="Identity" в edmx. Если вы открываете edmx с помощью блокнота и находите свою сущность, добавьте это и к свойству ключа и посмотрите, работает ли это.
Хотя я не знаю о оракуле, у меня есть опыт работы с Entity Framework в некоторой степени,
Я предполагаю, что MyObj
таблица в базе данных,
Затем,
container.MyObj.AddObject(myObj);
container.SaveChanges();
Проверьте погоду, это дает такое же исключение.