Сопоставление коллекции и единого свойства навигации, которые указывают на одну и ту же таблицу

#entity-framework #wcf-ria-services

#entity-framework #wcf-ria-services

Вопрос:

У меня есть следующая модель:

 public class Customer
{
    [Key]
    [ForeignKey("MainAddress")]
    [Column(Order = 1)]
    public string CustomerNumber { get; set; }

    // .. some more standard props that aren't keys/FKs etc

    [ForeignKey("MainAddress")]
    [Column(Order = 2)]
    public string MainAddressCode { get; set; }

    [Include]
    [Association("Addresses", "CustomerNumber", "CustomerNumber")]
    public IList<CustomerAddress> Addresses { get; set; }

    [Include]
    [Association("MainAddress", "CustomerNumber,MainAddressCode", "CustomerNumber,CustomerAddressCode")]
    public CustomerAddress MainAddress { get; set; }
}

public class CustomerAddress
{
    public string CustomerNumber { get; set; }

    public string CustomerAddressCode { get; set; }

    // .. address props after this
}
  

Я хотел бы иметь возможность заставить entity Framework извлекать список адресов для клиента, но также извлекать основной адрес, используя MainAddressCode поле в сочетании с CustomerNumber

На данный момент самое близкое, что я могу получить, это то, что сгенерированный запрос выглядит следующим образом:

 SELECT 
    1 AS [C1], 
    [Extent1].[CustomerNumber] AS [CustomerNumber], 
    [Extent1].[CustomerName] AS [CustomerName], 
    [Extent1].[MainAddressCode] AS [MainAddressCode], 
    [Extent2].[CustomerNumber] AS [CustomerNumber1], 
    [Extent2].[CustomerAddressCode] AS [CustomerAddressCode], 
    [Extent2].[Customers_CustomerNumber] AS [Customer_CustomerNumber] <--- Argh!
    FROM  [dbo].[Customers] AS [Extent1]
    LEFT OUTER JOIN [dbo].[CustomerAddress] AS [Extent2] ON ([Extent1].[MainAddressCode] = [Extent2].[CustomerAddressCode]) AND ([Extent1].[CustomerNumber] = [Extent2].[CustomerNumber])
  

Я думаю, это потому, что EF по соглашению добавляет префикс к Customer имени объекта в начале FK для CustomerAddress таблицы.

Как я могу указать имя столбца внешнего ключа в CustomerAddress таблице, чтобы запрос выполнялся правильно? Нужно ли мне использовать fluent API вместо атрибутов?

Ответ №1:

В итоге получилось следующее:

 var config = modelBuilder.Entity<Customer>();

        config.HasMany(x => x.Addresses)
            .WithRequired()
            .HasForeignKey(x => new { x.CustomerNumber });

        config.HasRequired(x => x.MainAddress)
            .WithMany()
            .HasForeignKey(x => new { x.CustomerNumber, x.MainAddressCode });
  

Кажется, пока работает!