2009-03-12 18 views
6

Estoy evaluando el uso de EF en un esquema existente - el problema es que no puedo resolver cómo configurar asociaciones entre tablas donde la clave externa NO es la clave principal de la mesa maestraCómo administrar claves "secundarias" en Entity Framework

A modo de ejemplo, un foo puede tener muchas bars como se define como esto (valga la pseudocódigo):

table foo { 
    int foo\_id pk, 
    char(10) foo\_code, 
    ... 
} 

table foobar { 
    int bar\_id pk, 
    char(10) bar\_foo\_code fk(foo.foo\_code), 
    ... 
} 

¿Qué me falta para ser capaz de crear la asociación foo_foobar, y por lo tanto una propiedad Bars de navegación en la entidad Foo?

+0

Tuvimos los mismos problemas aquí y al final tuvimos que realizar cambios en nuestra base de datos para que las claves externas solo apuntaran a las claves principales. ¿No hay forma de que puedas cambiar tu esquema de base de datos? – CraftyFella

+0

Desafortunadamente no, el esquema es una pesadilla por razones heredadas, y tenemos que interoperar con él. Apesta, lo sé. Dicho esto, he visto casos en los que es totalmente correcto tener una clave principal Y una clave externa separada (posiblemente compuesta). – Rammesses

Respuesta

3

Linq to entities no admite las teclas foráneas que no apuntan a la clave principal de una tabla (ver el mensaje de registro 3). Linq a las entidades lo tratará como un campo normal en una tabla. No podrá navegar a la entidad a la que está vinculado.

Si tiene un esquema existente, le recomendaría usar el edm generator ya que esto creará el archivo EMDX, el código detrás y hasta el código de vista (que puede ser muy grande). Si su esquema actual es bastante grande, consulte este post, que explica cómo tratar con esquemas grandes.

Cuando ejecuta el generador de EDM, encontrará todas las cosas que no son compatibles.

En cuanto a un acceso anterior EDMGen2.exe tenemos los siguientes tipos de mensajes de ida:

  1. El tipo de datos 'sql variant' no es
    soportados, la columna 'ColumnName' en la tabla 'TableName' fue excluido.
  2. La tabla/vista 'tableName' no contiene tiene definida una clave principal. La clave ha inferido y la definición fue creado como una tabla/vista de sólo lectura
  3. La relación 'RelationshipName' tiene columnas que no son parte de la clave de la tabla en el lado primario de la relación que no es compatible, se excluyó la relación .

También hemos encontrado que el proyecto Linq en realidad se estrelló Visual Studio bastante ya que el archivo de código producido por EDM era más de 80 mb.

Cuestiones relacionadas