Отображение отношений с устаревшей базой данных с использованием Entity Framework CTP5 - PullRequest
1 голос
/ 22 февраля 2011

У меня проблемы с отображением двух объектов вместе с 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, но это не стоит того для приложения, над которым я работаю.

1 Ответ

2 голосов
/ 22 февраля 2011

От SalesOrder до Address будет this.References(x => x.Address), и у вас будет отдельное поле для AddressID, чтобы вы могли сопоставить ассоциацию внешнего ключа и имя столбца.

В адреседля отображения у вас будет:

this.WithMany(x => x.SalesOrders)

В вашем фактическом POCO вам понадобится FK в SalesOrder POCO для Address и один Address POCO.

Так в классе SalesOrder:

Address Address {get;set;} 
int AddressID {get;set;}

В классе Адрес:

List<SalesOrder> SalesOrders {get;set;}

Это должно сделать это для вас.

Если бы я мог спроситьзачем использовать Fluent поверх аннотаций?Краткий обзор аннотаций, а также производительность на строку кода намного лучше, чем при использовании отображения Fluent.

...