Я использую 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
, CONSTRAINTFK_agent_office_OfficeId
FOREIGN KEY (OfficeId
) REFERENCESoffice
(OfficeId
) ON DELETE CASCADE ON UPDATE CASCADE)"
Это звучит для меня как EF пытается сохранить агент перед ведомствами. Поэтому, когда он записывает первый агент в базу данных, нет соответствующего офиса, и транзакция терпит неудачу. Я бы предположил, что EF выяснит правильный порядок вещей (на основе навигационных свойств) и сохранит вещи в правильном порядке?
Теперь я должен указать, что когда мое приложение добавило агентов и офисов в DbContext, оно сначала добавило агентов, а затем Офисы - и, возможно, именно поэтому EF также вставляет их в базу данных в тот же заказ. К сожалению, когда мое приложение вызывает веб-API, API сначала отправляет мне XML-данные агентам, а затем - позже.
Как я могу сделать EF сохранением офисов перед агентами?
Если таблица агента ссылается на первичный ключ таблицы Office, тогда EF сначала создаст строку Office, чтобы ее ID можно было вставить в новую строку агента. EF не только видит навигационные свойства, но также и то, как они выводятся из сопоставлений db. –
Можете ли вы добавить код, в который вы добавляете контекст? – Mats391
У вас возникла эта проблема, если вы хотите добавить новый «Агент и офис» или когда хотите добавить только агента? –