Подтвердить что ты не робот

Первый код структуры сущностей - определение отношений/ключей

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

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

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

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

--> = 1 to Many Relationship
  • Клиент → CustomerLocation
  • CustomerLocation → SalesOrder
  • SalesOrder → Счет-фактура
  • SalesRep → SalesOrder
  • PaymentTerm → Заказчик
  • PaymentTerm → SalesOrder
  • 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
4b9b3361

Ответ 1

Это исключение, вызванное сервером 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: на false на оскорбительные отношения.

Ответ 2

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

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

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; }
}