Entity Framework Code First: Как я могу смоделировать отношения клиент / адрес? - PullRequest
2 голосов
/ 01 марта 2011

Вот моя упрощенная модель:

public class Customer
{
    public int ID { get; set; }
    public int MailingAddressID { get; set; }
    [ForeignKey("MailingAddressID")]
    public Address MailingAddress { get; set; }

    public virtual ICollection<Address> Addresses { get; set; }
}

public class Address
{
    public int ID { get; set; }
    public int CustomerID { get; set; }
    [ForeignKey("CustomerID")]
    public Customer Customer { get; set; }
}

Когда я пытаюсь создать базу данных, я получаю следующую ошибку:

Введение ограничения FOREIGN KEY 'Customer_MailingAddress' on table 'Клиенты могут вызывать циклы или несколько каскадных путей.Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, либо измените другие ограничения FOREIGN KEY.Не удалось создать ограничение.Смотрите предыдущие ошибки.

Я не понимаю, в чем проблема.Я понимаю, что Клиент с адресом не может быть удален, а также что Адрес, который является Почтовым адресом Клиента, также не может быть удален.

Это соответствует моему дизайну, потому что, если у Клиента есть один или несколько адресов, то это должен быть почтовый адрес, и этот адрес не может быть удален.

Так чего мне здесь не хватает?Спасибо!

Редактировать:

Забыл упомянуть, что я попытался добавить следующую строку в метод OnModelBuilding:

modelBuilder.Entity<Customer>().Property(x => x.MailingAddressID).IsOptional();

Это позволяет базе данныходнако при добавлении клиента я получаю следующую ошибку:

Оператор INSERT конфликтует с ограничением FOREIGN KEY "Customer_MailingAddress".Конфликт произошел в базе данных «DomainModel.SeasideHeightsEntities», таблице «dbo.Addresses», столбце «ID».Заявление было прекращено.

Все еще не знаю, как правильно смоделировать это.

1 Ответ

3 голосов
/ 01 марта 2011

Проблема в том, что ... которое удаляется первым, клиент или почтовый адрес? Вы не можете удалить их обоих одновременно, удаление будет происходить в последовательности. Когда первый удаляется, он не выполняет правило b / c, второй еще не был удален.

Из того, что я вижу в вашей модели, я бы не использовал внешние ключи для обработки этой логики, я бы обработал ее во время проверки объекта, добавив атрибут [Required] в свойство MailingAddress вместо foreignkey.

Следует также учитывать дополнительную логику реализации, чтобы гарантировать, что MailingAddress является частью коллекции адресов.

...