DbContext: зависимое свойство / исключение ReferentialConstraint при использовании составного ключа - PullRequest
0 голосов
/ 01 марта 2012

Я использую EntityFramework через DbContext и существующую базу данных.

Когда я добавляю сущность Order в свой контекст и вызываю SaveChanges (), я сталкиваюсь с исключением: «Зависимое свойство в ReferentialConstraint сопоставляется с генерируемым хранилищем столбцом. Column: OrderId».

Я полагаю, что это происходит из-за составного ключа в моей таблице OrderAddress, и я надеюсь, что есть способ обойти это ... Я не хочу создавать IDENTITY для этой таблицы.

Вот мои сущности, упрощенно ...

// OrderId is an IDENTITY PK
public class Order
{
     public int OrderId { get; set; }
     public IList<OrderAddress> Addresses { get; set; }
     public int Total { get; set; }
}

// PK on this table is composite key of OrderId and OrderAddressTypeId
public class OrderAddress
{
     public int OrderId { get; set; }
     public int OrderAddressTypeId { get; set; }
     public string Address { get; set; }
}

Вот мой контекст, упрощенный ...

public class StoreContext : DbContext
{
     DbSet<Order> Orders { get; set; }
     DbSet<OrderAddress> OrderAddresses { get; set; }

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
     {
          // Set the Identity for Order
          modelBuilder.Entity<Order>()
               .Property(x => x.OrderId)
               .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

          // Set composite key for Order Address
          modelBuilder.Entity<OrderAddress>()
               .HasKey(x => new { x.OrderId, x.OrderAddressTypeId });
     }
}

ПРИМЕЧАНИЕ. Я посмотрел на другие похожие вопросы и попробовал решения, перечисленные безуспешно. Я проверил, что мои внешние ключи правильно настроены в базе данных. В моем вопросе отличается использование составного ключа.

Заранее спасибо за помощь.

UPDATE:

В итоге это никак не связано с составным ключом. В моем методе Context OnModelCreating была дополнительная строка, которая требовала дочернюю сущность OrderSummary, которая основана на представлении в моей базе данных. Линия выглядела так ...

modelBuilder.Entity<OrderSummary>().HasRequired(x => x.Order).WithRequiredPrincipal(x => x.OrderSummary);

Я никогда не предполагал, что OrderSummary будет обязательным принципалом Order. Изменение на следующее решило проблему ...

modelBuilder.Entity<OrderSummary>().HasRequired(x => x.Order);

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

Спасибо за внимание.

1 Ответ

1 голос
/ 01 марта 2012

Эта ошибка говорит о том, что некоторое свойство OrderId (исключение должно содержать информацию об объекте или отношении, где это происходит) отображается как сгенерированное хранилище = для него DatabaseGeneratedOption установлено значение Identity или Computed. Если проблема связана с сущностью OrderAddress, попробуйте добавить ее в определение сопоставления:

modelBuilder.Entity<OrderAddress>()
            .Property(x => x.OrderId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
...