У меня проблемы с отображением двух объектов вместе с Entity Framework CTP5 с использованием Code First / Fluent API. База данных старая из другого приложения (Exact MAX), на которое переключается наша компания, и я пишу приложение для собственного использования для управления отгрузками на нашем складе. Ничего не сохраняется в более старой базе данных, которая включает объекты, упомянутые в этом посте.
Объектами являются SalesOrder, который имеет только один адрес, и Address, который может иметь много SalesOrder. Я должен указать имена столбцов, и это одна из проблем. Другое состоит в том, что адрес имеет два ключа: идентификатор клиента и идентификатор адреса, которые связаны с соответствующими столбцами в SalesOrder. Имена столбцов ужасны: CUSTID_27 и SHPCDE_27 в таблице SO_Master для SalesOrders, CUSTID_24 и SHPCDE_24 в таблице SHIPPING_MASTER для адресов.
Я в конце концов сдался поздно вечером. Строки кода в этом посте взяты из карты для SalesOrder, а последние две части предназначены для отображения SalesOrder и Address. Для каждого ключа есть сопоставление, которое я собрал во время поисков в Google, но я даже не уверен, что это нужно сделать как два отдельных прохода. Полученные записи адресов сами по себе в порядке, а в SalesOrders - нет. Одна извлеченная запись SalesOrder имела действительный адрес, но остальные SalesOrder имели нулевые адреса.
this.ToTable("SO_Master");
this.HasKey(so => so.Id);
this.Property(so => so.OrderDate).HasColumnName("ORDDTE_27");
this.Property(so => so.Id).HasColumnName("ORDNUM_27");
// Maps Customers
this
.HasOptional(s => s.Customer)
.WithMany(c => c.SalesOrders)
.IsIndependent()
.Map(m => m.MapKey(c => c.Id, "CUSTID_27"));
// Maps Address
this
.HasOptional(s => s.Address)
.WithMany(a => a.SalesOrders)
.IsIndependent()
.Map(m => m.MapKey(a => a.CustomerId, "CUSTID_27"));
this
.HasOptional(s => s.Address)
.WithMany(a => a.SalesOrders)
.IsIndependent()
.Map(m => m.MapKey(a => a.Id, "SHPCDE_27"));
У меня не будет проблем с использованием аннотаций данных, если это необходимо. Я мог бы вместо этого использовать LINQ to SQL, но я хотел бы посмотреть, есть ли решение, использующее это. Возможно, EF не лучший выбор для этой базы данных, но код достаточно хорошо отделен, чтобы я мог поэкспериментировать. Я использую Visual Studio Express и SQL Server Express 2008 R2 и не смог найти ничего, что позволило бы использовать конструкторы, поэтому я использую Code First.
Спасибо, что нашли время, чтобы прочитать этот пост.
ОК, в итоге я принял предложение Vulgarbinary использовать аннотации данных и просто использовал атрибуты ForeignKey там, где они были нужны. Мне все еще приходилось использовать Fluent API для сопоставления Адреса с Заказчиком. Я не уверен, почему именно. Записи адресов продолжали возвращаться с пустыми клиентами без отображения Fluent API. Я думаю, потому что у меня есть два ключа в адресе для связи адресов с заказами, но только один для сопоставления адресов клиенту.
this.HasRequired(a => a.Customer).WithMany().HasForeignKey(a => a.CustomerId);
Я думаю, что теперь я понимаю, как лучше использовать Fluent API, но мне, очевидно, нужно больше читать. Возможно, я смогу вернуться и изменить некоторые атрибуты обратно на строки Fluent, но это не стоит того для приложения, над которым я работаю.