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 ответ

У меня была твоя проблема просто удалите свою базу данных и файлы миграции. после этого добавьте новую миграцию, чтобы создать новую базу данных.

Другие вопросы по тегам