У меня возникли проблемы с сопоставлением двух объектов вместе с Entity Framework CTP5 с использованием Code First/Fluent API. База данных старая из другого приложения (Exact MAX), на которое переходит наша компания, и я пишу приложение для собственного использования для управления отгрузками на нашем складе. Ничего не сохраняется в старой базе данных, в которую входят объекты, упомянутые в этом посте.
Сущностями являются SalesOrder, у которых есть только один Address, и Address, у которых может быть много SalesOrders. Мне нужно указать имена столбцов, и это одна из проблем. Во-вторых, адрес имеет два ключа: идентификатор клиента и идентификатор адреса, которые связаны с соответствующими столбцами в SalesOrder. Имена столбцов ужасны: CUSTID_27 и SHPCDE_27 в таблице SO_Master для SalesOrders, CUSTID_24 и SHPCDE_24 в таблице SHIPPING_MASTER для адресов.
В конце концов я сдался прошлой ночью. Строки кода в этом сообщении взяты из карты для SalesOrder, а последние две части предназначены для сопоставления SalesOrder и Address. Для каждого ключа есть сопоставление, которое я собрал вместе из поиска Google, но я даже не уверен, что это нужно делать двумя отдельными проходами. Полученные записи Address сами по себе в порядке, а записи в SalesOrders — нет. Одна извлеченная запись SalesOrder имела допустимый адрес, но остальные SalesOrders имели нулевые адреса.
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. Я думаю, потому что у меня есть два ключа в Address для привязки адресов к заказам, но только один для сопоставления клиентов с адресами.
this.HasRequired(a => a.Customer).WithMany().HasForeignKey(a => a.CustomerId);
Я думаю, что теперь я немного лучше понимаю, как использовать Fluent API, но мне, очевидно, нужно больше читать. Возможно, я смогу вернуться и изменить некоторые атрибуты обратно на строки Fluent, но это не стоит того для приложения, над которым я работаю.