Entity Framework Code First - Определение отношений / ключей - PullRequest
38 голосов
/ 04 апреля 2011

Сначала я проектирую свою базу данных, используя код, и мне нужна небольшая помощь.

Я получаю эту ошибку:

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

Я пытаюсь иметь следующие отношения / ключи:

--> = 1 to Many Relationship
  1. Клиент -> Расположение клиента
  2. CustomerLocation -> SalesOrder
  3. SalesOrder -> Счет
  4. SalesRep -> SalesOrder
  5. PaymentTerm -> Клиент
  6. PaymentTerm -> SalesOrder
  7. PaymentTerm -> Счет

Я пытаюсь определить их по стандарту:

<ClassName><PrimaryKeyID>

Пример: Customer имеет свойство ID, поэтому в CustomerLocation я определяю внешний ключ следующим образом:

Public Property CustomerID AS Integer

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

И не могу ли я иметь несколько внешних ключей для одного и того же первичного ключа объекта?

Обновлено

Итак, чтобы определить отношения, вы используете ClassName.PrimaryKeyProperty? или вы используете свойства навигации? Или оба? Confused !!

Обновление 2

То есть, чтобы установить отношения, вы должны определить обе стороны ... Я думаю.

Public Class Customer
    Public Property ID AS Integer
    Public Overrideable Property Locations AS ICollection(OF CustomerLocation)

End Class

Public Class CustomerLocation
    Public Property ID AS Integer
    Public Property CustomerID AS Integer

End Class

Ответы [ 2 ]

97 голосов
/ 04 апреля 2011

Это исключение, вызванное сервером SQL, когда у вас есть несколько путей каскадного удаления. Если вы удалите свой PaymentTerm, он вызовет каскадное удаление для всех трех отношений. Это взорвется при создании либо SalesOrder, либо Invoice. EF по умолчанию создает все отношения один-ко-многим с ON DELETE CASCADE, вы можете переназначить свое конкретное отношение, чтобы оно не использовалось:

modelBuilder.Entity<...>()
            .HasRequired(...)
            .WithMany(...)
            .HasForeignKey(...)
            .WillCascadeOnDelete(false);

Или вы можете отключить его глобально, удалив соглашение:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();   

Вы можете обойти эту ошибку в конкретной миграции, отредактировав сгенерированный метод Up() с помощью строки, подобной этой:

AddForeignKey("dbo.Payments", "EventID", "dbo.Events", "EventID", cascadeDelete: true)

и замените это значение cascadeDelete: на ложное в оскорбительных отношениях.

4 голосов
/ 04 апреля 2011

Читать это , я уверен, что это поможет вам найти ответ.

Кроме того, в соответствии с blogpost ScottGu, я думаю, что в целом должно быть, что вы просто создаете классы следующим образом (я не читал это достаточно внимательно, поэтому вы должны проверить это для получения более подробной информации) ):

public class Customer
{
    public int CustomerID { get; set; }
    public int CustomerLocationID { get; set; }
    public virtual CustomerLocation Location { get; set; }
}

public class CustomerLocation
{
    public int CustomerLocationID { get; set; }
    public virtual ICollection<Customer> Customers { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...