2010-05-18 18 views
5

Estoy migrando una aplicación ASP anterior a una versión .NET moderna, para reducir los tiempos de desarrollo que estamos viendo .NET 4.0 Entity Framework. Sin embargo, parece que hemos golpeado un muro de ladrillo en nuestro desarrollo con este problema.Problema de implementación de tabla por jerarquía y herencia

Given es una pequeña parte de nuestra base de datos: OBJETO de tabla que contiene una lista de automóviles y sus respectivas propiedades. También tenemos una tabla OBJECT_OPTIONS que contiene, para un automóvil dado en OBJECT, una lista de OPCIONES, ACCESORIOS y EQUIPAMIENTO ESTÁNDAR. Estos tres tipos tienen todos los mismos campos y, por lo tanto, están almacenados en la misma tabla. La columna ncopt_type se usa para discriminar entre las diferentes listas. Los valores posibles son: 'opt', 'acc' y 'sta'. La tabla OBJECT_OPTIONS vincula a OBJECT a través de ncopt_obj_id que representa un automóvil único (obj_id) en la tabla OBJECT.

Nuestro objetivo es proporcionar a la entidad objeto con 3 propiedades que enlazan con las diferentes listas OBJECT_OPTIONS: - opciones de propiedades - ACCESORIOS propiedad - STANDARDEQUIPMENT propiedad

Hemos probado diferentes tutoriales y tutoriales relativos a la tabla -per-jerarquía a través del modelo de herencia, pero no han tenido éxito en la creación de un modelo edificable.

Técnicamente lo que hicimos fue:

  • crear el objeto entidad
  • Crear entidad OBJECT_OPTIONS, que sea abstracta
  • Añadir entidades OPCIÓN, accesorios y STANDARD_EQUIP todos utilizando OBJECT_OPTIONS BaseType
  • Añadir condiciones a todos tres tablas en ncopt_type = '...'
  • Agregue 3 propiedades de navegación a OBJETO, todas vinculadas a una de las entidades heredadas: OPCIONES, ACCESORIOS y STAND AARD_EQUIPMENT

Un manojo de errores muestra durante esta configuración, sino que terminan con éste:

Error 3032: Problema en fragmentos de mapeo a partir de las líneas 250, 286: EntityTypes NCO.Model. OPTION, NCO.Model.ACCESSOIRE, NCO.Model.STANDAARD_EQUIP se asignan a las mismas filas en la tabla OBJECT_OPTIES. Las condiciones de asignación se pueden usar para distinguir las filas a las que se asignan estos tipos.

Sin embargo, existe una condición presente en los tres objetos.

No he encontrado ninguna solución a este problema y ya he dedicado demasiado tiempo a él. Actualmente estamos utilizando un método alternativo, pero nos encantaría solucionarlo, ya que esta situación se presentará un par de veces más al final del proyecto.

Cualquier ayuda apreciada, si necesita más información, por favor envíeme un comentario o un correo electrónico.

+1

Así, ehm, nadie sabe? –

+0

Parece que no. Tengo el mismo problema, ... ¡tal vez somos nosotros dos! – Stimul8d

+0

¿Podría adjuntar una imagen de las tablas relevantes y de las entidades relevantes de edmx? - Ayudaría a aclarar lo que estás tratando de hacer. Deja un comentario aquí después de la edición. –

Respuesta

1

No estoy convencido de que usted puede hacer esto al 100% desde el interior del diseñador de EF, pero puede hacerlo de esta manera:

  1. crear el objeto entidad (He cambiado el nombre de este 'vehículo' para el ejemplo)
  2. crear la entidad OBJECT_OPTIONS, hacen que sea abstracta
  3. Añadir entidades OPCIÓN, accesorios y todo ello utilizando STANDARD_EQUIP BaseType OBJECT_OPTIONS
  4. añadir condiciones a las tres mesas en ncopt_type = '...'

A continuación, agregue en las propiedades que desea utilizar una clase parcial para el vehículo:

using System.Collections.Generic; 
using System.Linq; 

public partial class Vehicle 
{ 
    public IEnumerable<ACCESSORY> Accessories 
    { 
     get { return this.OBJECT_OPTIONS.OfType<ACCESSORY>(); } 
    } 

    public IEnumerable<OPTION> Options 
    { 
     get { return this.OBJECT_OPTIONS.OfType<OPTION>(); } 
    } 

    public IEnumerable<STANDARD_EQUIP> StandardEquipments 
    { 
     get { return this.OBJECT_OPTIONS.OfType<STANDARD_EQUIP>(); } 
    } 
} 
+0

Hola Steve, hemos abandonado este método después de que tardó mucho en descubrirlo. Podríamos recuperarlo nuevamente en una versión futura. Cuando lo haga, intentaré tu solución. Por ahora parece que su solución podría funcionar, así que la marcaré como aceptada. Gracias por tomarse el tiempo para responder a esto. –

+0

Sin problemas :) –

Cuestiones relacionadas