Pregunta

Tengo una tabla con un int PK, uno no, un campo nulo y dos campos de cadena nulos.

Cuando voy y configure un diseño de estilo TPH en EF, lo configuré de esta manera:

El tipo de nivel superior solo tiene el PK y el campo no nulo.

El primer nivel verifica el primer campo anulable como discriminador. El tipo no nulo resultante es abstracto. Mapeo el campo en consecuencia.

Hago esto nuevamente para el segundo campo, nuevamente mapeo donde no es nulo. Establecí Nullable = False en los campos I Map.

<EntitySetMapping Name="Items">
        <EntityTypeMapping TypeName="IsTypeOf(Model1.Item)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
            <ScalarProperty Name="OtherID" ColumnName="OtherID" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(Model1.BothNullItem)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
            <Condition ColumnName="FirstNullField" IsNull="true" />
            <Condition ColumnName="NullField2" IsNull="true" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(Model1.FirstFieldNull)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
            <ScalarProperty Name=FirstNullField" ColumnName="FirstNullField" />
            <Condition ColumnName="FirstNullField" IsNull="false" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(Model1.NotNullSubItem1)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
            <Condition ColumnName="NullField2" IsNull="true" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(Model1.NotNullSubItem2)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
             <ScalarProperty Name="NullField2" ColumnName="NullField2" />
             <Condition ColumnName="NullField2" IsNull="false" />
          </MappingFragment>
        </EntityTypeMapping>
</EntitySetMapping>

Estoy obteniendo "dos entidades con diferentes claves se asignan a la misma fila".

Estoy pensando que es porque tal vez el primer elemento no es el atributo nulo no está siendo heredado por los niños.

He creado un tercer tipo para tratar de cuidar el caso de que Nullfield1 es nulo y nullfield2 no es nulo (lo que no sucederá en mi DB, tengo una restricción), pero incluso si lo agrego, no funciona .

Agregar explícitamente la condición no nula en cualquiera de los 2 subdirectores requiere que mapee la columna, que todavía no funciona, incluso si la mapeo a alguna propiedad extraña.

Ninguna de las combinaciones de condiciones para "BothNullItem" funciona tampoco.

¿Algunas ideas?

¿Fue útil?

Solución

WELP, terminé renunciando a tratar de obtener columnas discriminatoras para propagarse a través de la herencia, así que creé 3 vistas, un nivel superior, una para el campo nulo1 y no el campo nulo, y luego en el campo no nulo uno, hago el campo2 el discriminador columna en ef. Esto suena como una respuesta horrible a mi problema, así que me gustaría saber de alguien al saber cuál es el trato. Buehler?

ACTUALIZACIÓN: ¡SEGIDO! Saliendo del concepto de partición horizontal en uno de los artículos que encontré en MSDN (http://msdn.microsoft.com/en-us/library/cc716779.aspx)i entró y agregó manualmente las condiciones en el MSL. Parece que no puede tener este trabajo automáticamente del diseñador. Para aquellos de ustedes que se preguntan, abran el EDMX en el XML Editer y ve y miran los elementos de condiciones de sus asignaciones. Agregue condiciones adicionales donde sea necesario (¡aparentemente las condiciones no heredan de las entidades matrices para que tenga que agregarlas manualmente a los niños) y compilarlos!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top