2010-06-29 4 views
3

У меня есть две таблицы: адрес и контакт, которые объединены на contactID (в контакте). Обе эти таблицы имеют сущности в моей модели данных Entity (EF 4.0), и я не хочу их изменять.Entity Framework - проблема со структурой сущности

Я хочу создать новый объект, который содержит информацию от обоих объектов.

То, что я сделал до сих пор:

В CSDL:

<EntityContainer...> 
    <EntitySet Name="AddressTest" EntityType="WebGearsModel.Test" /> 
    <EntitySet Name="ContactTest" EntityType="WebGearsModel.Test" /> 
</EntityContainer> 

<EntityType Name="Test"> 
    <Key> 
    <PropertyRef Name="addressID" /> 
    </Key> 
    <Property Type="Int32" Name="addressID" Nullable="false" annotation:StoreGeneratedPattern="Identity" /> 
    <Property Type="Int32" Name="contactID" Nullable="false" /> 
    <Property Type="String" Name="firstName" Nullable="false" MaxLength="30" FixedLength="false" Unicode="false" /> 
    <Property Type="String" Name="emailAddress" Nullable="false" MaxLength="150" FixedLength="false" Unicode="false" /> 
</EntityType> 

В моем отображении CS:

<EntitySetMapping Name="AddressTest"> 
    <EntityTypeMapping TypeName="WebGearsModel.Test"> 
    <MappingFragment StoreEntitySet="Address"> 
     <ScalarProperty Name="addressID" ColumnName="addressID" /> 
     <ScalarProperty Name="contactID" ColumnName="contactID" /> 
     <ScalarProperty Name="firstName" ColumnName="firstName" /> 
    </MappingFragment> 
    </EntityTypeMapping> 
</EntitySetMapping> 

<EntitySetMapping Name="ContactTest"> 
    <EntityTypeMapping TypeName="WebGearsModel.Test"> 
    <MappingFragment StoreEntitySet="Contact"> 
     <ScalarProperty Name="contactID" ColumnName="contactID" /> 
     <ScalarProperty Name="emailAddress" ColumnName="emailAddress" /> 
    </MappingFragment> 
    </EntityTypeMapping> 
</EntitySetMapping> 

Ошибка я получаю это:

Проблема с отображением фрагментов, начиная с at l ine 150: Необходимо указать отображение для всех ключевых свойств (ContactTest.addressID) EntitySet ContactTest.

Как я могу сопоставить AddressID от объекта Contact, если он не существует в этом объекте? Я предполагаю, что мне нужна какая-то ассоциация, но я не уверен, как это сделать ... Помните, что я не хочу изменять существующие сущности Address и Contact.

ответ

4

Помните определение юридического лица:

Объект, который не определяется его атрибутов, а нити из непрерывности и его идентичности.

Каждое «сущность» должно иметь то, что однозначно идентифицирует его; ключ. Однако вы пытаетесь определить два типа объектов из одного физического типа, который имеет только один ключ, который обеспечивает согласованное идентификатор для адресов, но не контактов. Это нарушает правила Entity, что делает концепцию ContactTest недействительной.

Поскольку базовый физический тип, Test, определяет свойство ключа, addressID, все производные от этого типа EntitySet должны сопоставлять это свойство в соответствии с правилами, определяющими Entity. Поддержание согласованности состояния невозможно иначе.

+0

У меня есть эта же проблема, но я не понимаю ничего из вышеизложенного, есть ли определение ламнов этого для кого-то нового для рамки сущности? Спасибо – AlexW

+0

Ну, это был ответ на гораздо более старую версию EF ... назад в 1.0 дня. С тех пор было много шансов, поэтому я не знаю, применяется ли это, но дело в том, что для объединения адреса и контакта оба объекта должны содержать один и тот же ключ. В случае OP адрес был сущностью, у которой был первичный ключ, addressID. Чтобы напрямую связать контакт с адресом, объект Contact, а также его базовая таблица также должны иметь адресID. EF может затем надлежащим образом связать две половины объекта через их общий ключ ... addressID. – jrista