Вы должны проанализировать свой объект, чтобы решить эту проблему.
Вот простой код для объяснения вашего Exception
:
static void Main()
{
using (MyDbContext ctx = new MyDbContext())
{
// Build a new object
MyClass o = new MyClass() { Id = 1, ChildObject = null };
// Add it to your Context (It's not in the DB yet!)
ctx.MyObjects.Add(o);
// Write all changes (the new object) to the Db
ctx.SaveChanges();
}
}
// You got some DbContext with a DbSet pointing to your Table "MyTable"
public class MyDbContext : DbContext
{
public DbSet<MyClass> MyObjects { get; set; }
}
// You've got a class to map your table to some nice object.
[Table("MyTable")]
public class MyClass
{
// Some column..
[Key]
public int Id { get; set; }
// And some ForeignKey! Which maps a column with the Id to an object.
[ForeignKey("ChildObjectId")]
public MyClass ChildObject { get; set; }
}
В этом примере я создаю Контекст, добавляю объект и сохраняю изменения (создаю Вставку в таблицу).
1-е: Исключение возникает в SaveChanges, поскольку для свойства "ChildObject" может быть установлено значение null, поскольку у нас нет никаких ограничений на это свойство.
2-й: Исключением является Db-исключение. Ваша Программа (вероятно) работает правильно. Но qour Db говорит вам, что в MyTable нельзя иметь строку без ссылки на ChildObject.
Вы должны спросить себя, правильно ли сконфигурирована БД (сделать столбец обнуляемым) или ваша программа забудет установить дочерний элемент.
Я надеюсь, вы видите: вы должны копаться в своем коде. У вас проблема с «полной моделью», и вам нужно ее решить.
Рассмотрите возможность чтения SQL-журнала контекста. Пример: ctx.Log = Console.WriteLine;
(У меня здесь нет студии, но я думаю, что должен быть примерно таким).
Таким образом, вы можете получить последний SQL-запрос и запустить его на своей базе данных для лучшего вывода ошибок.