TPH Is Not NULL mapped on a relationship

As I wrote in a previous post, with EF V1, there is a limitation on the mapping of columns with the condition Is Not Null: the property mapped to the column must be scalar and can’t be (indirectly) a navigation property.

So how to do the scenario of my previous post?

With a SSDL View of course:

<EntitySet Name=CustomerContacts EntityType=TestRelationshipsOnTPHModel.Store.CustomerContacts>

    <DefiningQuery>

        SELECT ContactId, CAST(CASE WHEN CustomerId IS NULL THEN 0 ELSE 1 END AS BIT) AS IsContactCustomer

        FROM Contacts

    </DefiningQuery>

</EntitySet>

<EntityType Name=CustomerContacts>

    <Key>

        <PropertyRef Name=ContactId />

    </Key>

    <Property Name=ContactId Type=int Nullable=false />

    <Property Name=IsContactCustomer Type=bit />

</EntityType>


Then you map it on your derived entity type (CustomerContact). So your MSL should be this:

<edmx:Mappings>

    <Mapping Space=C-S xmlns=urn:schemas-microsoft-com:windows:storage:mapping:CS>

        <EntityContainerMapping StorageEntityContainer=TestRelationshipsOnTPHModelStoreContainer CdmEntityContainer=TestRelationshipsOnTPHEntities>

            <EntitySetMapping Name=Contacts>

                <EntityTypeMapping TypeName=IsTypeOf(TestRelationshipsOnTPHModel.Contact)>

                    <MappingFragment StoreEntitySet=Contacts>

                        <ScalarProperty Name=ContactName ColumnName=ContactName />

                        <ScalarProperty Name=ContactId ColumnName=ContactId />

                    </MappingFragment>

                </EntityTypeMapping>

                <EntityTypeMapping TypeName=IsTypeOf(TestRelationshipsOnTPHModel.CustomerContact)>

                    <MappingFragment StoreEntitySet=CustomerContacts >

                        <ScalarProperty Name=ContactId ColumnName=ContactId />

                        <Condition ColumnName=IsContactCustomer Value=true />

                    </MappingFragment>

                </EntityTypeMapping>

            </EntitySetMapping>

            <EntitySetMapping Name=Customers>

                <EntityTypeMapping TypeName=IsTypeOf(TestRelationshipsOnTPHModel.Customer)>

                    <MappingFragment StoreEntitySet=Customers>

                        <ScalarProperty Name=CompanyName ColumnName=CompanyName />

                        <ScalarProperty Name=CustomerId ColumnName=CustomerId />

                    </MappingFragment>

                </EntityTypeMapping>

            </EntitySetMapping>

            <AssociationSetMapping Name=CustomerCustomerContact TypeName=TestRelationshipsOnTPHModel.CustomerCustomerContact StoreEntitySet=Contacts>

                <EndProperty Name=CustomerContact>

                    <ScalarProperty Name=ContactId ColumnName=ContactId />

                </EndProperty>

                <EndProperty Name=Customer>

                    <ScalarProperty Name=CustomerId ColumnName=CustomerId />

                </EndProperty>

                <Condition ColumnName=CustomerId IsNull=false />

            </AssociationSetMapping>

        </EntityContainerMapping>

    </Mapping>

</edmx:Mappings>


Thanks to Srikanth for his help.

This entry was posted in 7671, 7674, 7675. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>