Entity Framework вставка «один ко многим» - нарушение внешнего ключа - PullRequest
6 голосов
/ 30 сентября 2011

Я впервые использую Entity Framework и пытаюсь создать объект с коллекцией (и я хочу, чтобы все объекты в коллекции также создавались в базе данных), но у меня есть некоторые сторонниенарушения ключей.

Мои примеры таблиц:

table APPOINTMENTS: ID, VAR1, DATE_APPOINTMENT
table GUESTS: ID, APPOINTMENT_ID, USER_ID, VAR2, VAR3

Мой тестовый код:

DomainService aux = new DomainService();

APPOINTMENTS appointment = new APPOINTMENTS();
appointment.VAR1 = "BLA";
appointment.DATE_APPOINTMENT = new DateTime();

//The user with id = 1 is already created in the database
appointment.GUESTS.Add(new GUESTS { USER_ID = 1, VAR2 = 1, VAR3 = "F" });

aux.InsertAppointment(appointment);

На DomainService у меня есть:

public void InsertAppointment(APPOINTMENTS appointment)
{
    using (var context = this.ObjectContext)
    {
        context.AddToAPPOINTMENTS(appointment);
        context.SaveChanges();
    }
}

НоЯ получаю эту ошибку: {"ORA-02291: ограничение целостности (FK_GUESTS_APPOINTMENTS) нарушено - родительский ключ не найден"}

Что я делаю не так?

ОБНОВЛЕНИЕ: Чтобы создать идентификаторы в базе данных, я использую последовательность для каждой таблицы и триггер перед вставкой, чтобы получить следующее значение.Когда я создаю отдельный объект, например, встречу без гостей, он вставляется в базу данных и генерирует идентификатор.

Ответы [ 5 ]

4 голосов
/ 01 октября 2011

Решение этой проблемы:

"Поля идентификатора, сгенерированные из последовательностей, не будут обрабатываться правильно. После сохранения сущностей идентификаторы будут возвращены как 0. Я исправлюэто путем ручного взлома SSDL (откройте файл .edmx в текстовом редакторе) с помощью атрибутов StoreGeneratedPattern = "Identity" в полях идентификаторов (строки 6 и 16). Обратите внимание, что дизайнер может извлечь эти изменения при будущих модификациях.

Хотя я полагаю, что это не является абсолютно необходимым, возможно, было бы целесообразно изменить метаданные некоторых типов, такие как изменение «число» на «int» в вашем SSDL и «десятичное» на «Int32» в вашем CSDL, где это применимо.. Часто они не генерируются автоматически с нужными значениями, особенно с XE. "

@ http://www.chrisumbel.com/article/oracle_entity_framework_ef

2 голосов
/ 02 февраля 2017

При первом подходе к коду EF, если появляется эта ошибка

(ORA-02291: ограничение целостности (FK_GUESTS_APPOINTMENTS) нарушено - родительский ключ не найден)

В моем случае есть 2 таблицы, в которых есть столбцы Identity. Поэтому я просто добавил

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

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

Надеюсь, эта помощь:)

2 голосов
/ 19 декабря 2013

Что касается меня, проблема была решена простым открытием диаграммы .edmx и изменением свойства StoreGeneratedPattern с None на Identity для каждого первичного ключа в каждой таблице.После сохранения все было в порядке.

Я использую VS 2012, Entity Framework 5 (6 пока не поддерживается), Oracle 11.2, последний ODP.NET 12, .Net 4.5

0 голосов
/ 30 сентября 2011

Вы вставляете запись со значением внешнего ключа, который не найден в родительской таблице, на которую ссылается ограничение.

0 голосов
/ 30 сентября 2011

Я не вижу, где вы устанавливаете свой Первичный ключ (свойство ID класса встречи). Вы используете генератор ключей на стороне базы данных? Если нет, то это должно быть проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...