2017-02-15 4 views
0

Я использую Entity Framework 6.2 с кодовым первым. У меня есть эти два класса:Entity Framework, по-видимому, сохраняет дочерние объекты перед родительским объектом

public class Agent 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.None)] 
     public int? AgentId { get; set; } 
     public string FirstName { get; set; } 
     public string Surname { get; set; } 
     public int OfficeId { get; set; } 
     [ForeignKey("OfficeId")] 
     public virtual Office Office { get; set; }   
    } 

и

public class Office 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.None)] 
     public int OfficeId { get; set; } 
     public string Agency { get; set; } 
     public string Branch { get; set; } 
     [InverseProperty("Office")] 
     public virtual ICollection<Agent> Agents { get; set; } 
    } 

Таким образом, каждый агент принадлежит к офису (и только один офис). И наоборот, офис может содержать множество агентов.

Мое приложение подключается к веб-API, который передает XML-данные агентам и офисам (для этого я использую XDocument). Затем я заполняю свои DbContext этими объектами и вызываю dbContext.SaveChanges();

В этот момент, я получаю эту ошибку:

"Cannot add or update a child row: a foreign key constraint fails (fusion . agent , CONSTRAINT FK_agent_office_OfficeId FOREIGN KEY (OfficeId) REFERENCES office (OfficeId) ON DELETE CASCADE ON UPDATE CASCADE)"

Это звучит для меня как EF пытается сохранить агент перед ведомствами. Поэтому, когда он записывает первый агент в базу данных, нет соответствующего офиса, и транзакция терпит неудачу. Я бы предположил, что EF выяснит правильный порядок вещей (на основе навигационных свойств) и сохранит вещи в правильном порядке?

Теперь я должен указать, что когда мое приложение добавило агентов и офисов в DbContext, оно сначала добавило агентов, а затем Офисы - и, возможно, именно поэтому EF также вставляет их в базу данных в тот же заказ. К сожалению, когда мое приложение вызывает веб-API, API сначала отправляет мне XML-данные агентам, а затем - позже.

Как я могу сделать EF сохранением офисов перед агентами?

+0

Если таблица агента ссылается на первичный ключ таблицы Office, тогда EF сначала создаст строку Office, чтобы ее ID можно было вставить в новую строку агента. EF не только видит навигационные свойства, но также и то, как они выводятся из сопоставлений db. –

+0

Можете ли вы добавить код, в который вы добавляете контекст? – Mats391

+0

У вас возникла эта проблема, если вы хотите добавить новый «Агент и офис» или когда хотите добавить только агента? –

ответ

1

EF действительно работает правильно, исходя из свойств навигации. Что-то еще не так. Возможно, это может быть несколько вещей.

Почему вы используете [DatabaseGenerated(DatabaseGeneratedOption.None)]? Вы создаете и поддерживаете идентификаторы или являетесь базой данных? Если его база данных не нужна [DatabaseGenerated(DatabaseGeneratedOption.Identity)]?

Нулевой первичный ключ на агенте? Это верно? Первичные ключи не могут/не должны быть обнуляемыми ...

Вам не нужно устанавливать [InverseProperty("Office")] для нормального отношения 1 ко многим. Это может ввести в заблуждение EF.

+0

Спасибо Гарет, ваш ответ указал мне в правильном направлении – user1900799

Смежные вопросы