Entity Framework Fluent API не может вставить один-к-одному
Я пытаюсь вставить объект в таблицу базы данных с помощью Entity Framework и сначала использую код (свободно API). При этом я продолжаю сталкиваться с одной из следующих ошибок:
1) InvalidOperationException: зависимое свойство в ReferentialConstraint сопоставляется сгенерированным хранилищем столбцом. Колонка: "Идентификатор"
2) Невозможно вставить значение в столбец идентификаторов, если для параметра IDENTITY_INSERT установлено значение OFF.
Мои отношения один на один, однако, возможно, я смогу переработать или структурировать базу данных, чтобы выполнить то, что я хочу. Я также думал о том, чтобы использовать единицу к нулю или зону, хотя всегда требуется другой объект.
Итак, у меня есть следующие таблицы базы данных, сопоставленные с этими объектами C# (с виртуальным для отображения):
public class test
{
[Key]
public long Id { get; set; }
public DateTime ResultDate { get; set; }
public virtual test_additional test_additional { get; set; }
public virtual test_status test_status { get; set; }
}
public class test_additional
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public long TestId { get; set; } //Foreign Key to test
...
public virtual test test { get; set; }
}
public class test_status {
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public long TestId { get; set; } //Foreign Key to Test
public long TestFormId { get; set; } //this is the object I want to insert, Foreign key to the Primary key of test_form
...
public virtual test test { get; set; }
public virtual test_form test_form { get; set; } //object mapping
}
public class test_form {
[Key]
public long Id { get; set; } //Primary Key
public string FileName { get; set; }
public virtual test_status test_status { get; set; }
}
Итак, некоторые довольно простые объекты, я удалил элементы / столбцы, которые необходимы для функциональности для удобства чтения.
Так что есть test
объекты, которые имеют необязательный test_additional
или же test_status
,
Они генерируются с отношением один к нулю или один. Которые работают нормально, и у меня есть отношения, определенные как:
modelBuilder.Entity<test>()
.HasOptional(e => e.test_additional)
.WithRequired(e =>e.test);
modelBuilder.Entity<test>()
.HasOptional(e => e.test_status)
.WithRequired(e => e.test);
Теперь сущность, с которой у меня возникают проблемы, это test_form
, если test_status
определяется всегда должно быть test_form
связано с этим. В настоящее время у меня есть отношения, определенные как:
modelBuilder.Entity<test_form>()
.HasRequired(e => e.test_status)
.WithRequiredDependent(e => e.test_form);
Кроме того, я попытался добавить этот конфиг:
modelBuilder.Entity<test_status>()
.HasKey(e => e.TestFormId);
-
Вот простая реализация вставки этого объекта в базу данных:
try {
test UserTest = new test { ResultDate = DateTime.Now; }
UOW.test.Insert(UserTest);
UOW.Save();
test_additional ta = new test_additional { TestId = UserTest.Id; }
test_form tf = new test_form { FileName = "Testing.pdf"; }
UOW.test_additional.Insert( ta );
UOW.test_form.Insert( tf );
UOW.Save(); //This is where it will throw that error.
test_status status = new test_status {
TestId = UserTest.Id;
TestFormId = tf.Id;
}
UOW.test_status.Insert( status );
UOW.Save();
} catch {
throw;
}
-
Я использовал BreakPoints до сохранения единицы работы и могу подтвердить, что Id в test_form
По умолчанию для объекта используется значение long, равное 0. Поэтому я не устанавливаю столбец идентификаторов явно. После удаления test_form
(в реализованном методе) я могу вставить в test_additional
категории и сохранить без проблем.
Так что мой вопрос на самом деле... правильно ли определены мои сущностные отношения? Было бы разумнее использовать дополнительный One to Zero-or-One для test_form
объект? Почему я не могу вставить этот простой объект в мою базу данных?
Я также думал об определении виртуального test_form
объект в test_status как ICollection
тогда я мог бы использовать .HasMany(e => e.test_form).HasForeignKey(e => e.TestFormId);
поэтому он будет привязан к внешнему ключу, хотя я буду использовать только 1 элемент для test_status
,
Мнения? Я рядом?
Еще раз спасибо, что нашли время, чтобы прочитать мой вопрос!
1 ответ
У меня была твоя проблема просто удалите свою базу данных и файлы миграции. после этого добавьте новую миграцию, чтобы создать новую базу данных.