0

У меня есть структуру таблицы вроде следующего:ADO.NET Entity Data Model: Автоматически сгенерированные классы

Companies   Addresses 
*********   ********* 
ID     ID 
AddressID   ... 
BillingAddressID ... 

AddressID и BillingAddressID являются внешними ключами, которые присутствуют в таблице адресов. Когда я создаю свою модель на основе этой таблицы, а не получаю то, что я ожидаю получить (AddressID, BillingAddressID) в классе компании. Я получаю следующее:

public Addresses Addresses { .. } 
public global::System.Data.Objects.DataClasses.EntityReference<Addresses> AddressesReference { .. } 
public Addresses Addresses1 { .. } 
public global::System.Data.Objects.DataClasses.EntityReference<Addresses> Addresses1Reference { .. } 

Казалось бы, замена BillingAddress с Addresses1 (не совсем уверен, почему это происходит). Также это кажется обычным явным, когда у меня есть внешний ключ, то есть вместо идентификатора, который я получаю в таблице, а затем TableReference.

Я думаю, что я могу видеть, что происходит, вместо того, чтобы давать мне идентификатор в одиночку, он будет выполнять поиск и поиск фактической записи, на которую ссылается идентификатор. Тем не менее, я не совсем уверен, что такое поле TableReference для ....

Может ли это объяснить мне немного лучше?

Заранее спасибо.

ответ

2

Отношения представляются как объекты в Entity Framework, так же, как и сущности. Даже если вы не собираетесь много работать на них, объект отношений - это граждане первого класса в EF. EF создает объекты ObjectStateEntry для отслеживания изменений в отношениях, как и для объектов.

Вот почему есть две ссылки. Первый, AddressesReference - это ссылка на объект отношения, а не на точный объект, а второй адрес - фактический объект.

Peter Chan (link) и Джулия Лерман в своей книге «Программирование Entity Framework», 1-е издание, говорят, что понимание того, как отношения работают в EF, очень важно. Также они упоминают, что это первое, что запутывает разработчика, когда они начинают использовать EF.

+0

Это прояснилось для меня спасибо! – James

+0

Во-вторых, «это первое, что путает ...». Прямо сейчас я не могу получить что-либо, чтобы подтвердить, их интерфейс для этого ужасен! – Marc

0

Внешние ключи заменяются ссылкой на объект (коллекцию), на который указывает внешний ключ.

Таким образом, чтобы добавить адрес компании вы могли бы сделать что-то вроде:

Address a = new Address(); 
// ... set variables for address here 

currentCompany.Addresses = a; 
// or, the other way round (for collections) 
a.Companies.Add(currentCompany); 
+0

Почему у меня есть 2 ссылки? Адреса/AddressesReference. Также почему он заменяет BillingAddressID адресами 1/Addresses1Reference? – James

0

EF использует имена таблиц в качестве исходной точки, когда он строит модель, и именно поэтому вы видите «Адреса» и Addresses1 Вы можете открыть модель сущности в формате GUI и щелкнуть по каждой из ассоциаций. Их можно переименовать во все, что вам нравится, просто нажмите ссылку, просмотрите отображение, убедитесь, что это та, которая отображает «BillingAddressID», на «BillingAddressID» и переименуйте эту ссылку на «BillingAddress».

Обратите внимание, что текущая ссылка «Адреса» может быть одной mapp «BillingAddressID», поэтому вам нужно проверить обе ссылки.

Возможно, было бы лучше изменить отображение для «AddressID» как «Адрес» вместо «Адреса», если это также сопоставление от одного к одному.

+0

Спасибо, Джей. В чем же цель с полем AddressReference? Я использую это в любом случае? – James