#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 });
Кажется, пока работает!