2009-03-06 27 views
14

Estoy trabajando con algunas tablas heredadas que tienen relaciones, pero esas relaciones no se han establecido explícitamente como claves principales/externas. Creé un archivo .dbml utilizando "Clases de Linq a Sql" y establecí la asociación Case.CaseID = CaseInfo.CaseID adecuada. Mi clase resultante es CasesDataContext.Linq a SQL sin relaciones explícitas de clave externa

mis tablas (uno a muchos):

Case 
------------------ 
CaseID (int not null) 
MetaColumn1 (varchar) 
MetaColumn2 (varchar) 
MetaColumn3 (varchar) 
... 


CaseInfo 
------------------ 
CaseInfoID (int) 
CaseID (int nulls allowed) 
CaseInfoMeta (varchar) 
... 

Soy nuevo en LinqToSql y estoy teniendo problemas para hacer ..

CasesDataContext db = new CasesDataContext(); 
var Cases = from c in db.Cases 
      where c.CaseInfo.CaseInfoMeta == "some value" 
      select c; 

(Editar) Mi problema es que CaseInfo o CaseInfos no está disponible como miembro de Cases.

Escuché de un colega que podría probar ADO.Net Entity Data Model para crear mi clase Data Context, pero aún no lo he intentado y quería ver si estaría perdiendo el tiempo o debería ir. otra ruta Cualquier sugerencia, enlace, ayuda sería muy apreciada.

+0

¿guardó el archivo DBML? No creo que genere los archivos CS hasta que guardes. Podría ser por qué no muestra CaseInfo como miembro. –

+0

@madcolor, publiqué una configuración de muestra en mi respuesta, por favor compruébalo ya que probablemente sea un problema con la relación config – eglasius

Respuesta

26

volver a la diseñadora y comprobar la relación se ha configurado correctamente. Aquí hay un ejemplo de la vida real, con BillStateMasters con la propiedad "CustomerMasters1" (clientes para el estado): alt text http://i43.tinypic.com/ohl00l.jpg

Ps. la asignación de nombres se está limpiando ...

Actualización 1: También debe asegurarse de que ambas tablas tengan una definición primaria. Si la clave principal no está definida en la base de datos (y no se puede definir por el motivo que sea), asegúrese de definirlos en el diseñador. Abra las propiedades de la columna y configúrela como clave principal. Dicho esto, el seguimiento de entidades tampoco funcionará si no tiene una clave principal para la entidad, lo que significa que silenciosamente no actualiza la entidad. Por lo tanto, asegúrese de revisar todas las entidades y tenerlas todas con una clave principal (como dije, si no puede estar en la base de datos, entonces en el diseñador).

+3

Freddy tiene la solución ... La única advertencia es que obtendrá una "especificación de AutoSync incorrecta para error de miembro" si su clave principal también es un campo de identidad. Es posible que deba cerrar la Sincronización automática para esa columna en el diseñador. – madcolor

+1

¡No tener una llave primaria me ha hecho tropezar! Gracias por la ayuda –

+3

Ah, claves principales! +1 –

0

¿La asociación está establecida en Uno a uno o Uno a muchos? Si tiene la asociación establecida entre Uno y Muchos, entonces lo que tiene es un EntitySet, no un EntityRef y necesitará usar una cláusula where en el conjunto dependiente para obtener el valor correcto. Sospecho que quieres una relación One to One, que no es la predeterminada. Intente cambiarlo a One to One y vea si puede construir la consulta.

Nota: Estoy adivinando porque en realidad no nos has dicho cuál es realmente el "problema".

0

Su consulta se ve correctamente y debe devolver un conjunto de resultados de consulta de objetos Case.

Entonces ... ¿cuál es el problema?

(Editar) Mi problema es que CaseInfo no está disponible en casos ... es decir c.CaseInfo no existe donde estoy suponiendo que sería si no hubiera primaria explícita/extranjera clave relaciones.

¿Qué quiere decir con "not available"? Si creó la asociación en el diseñador como usted dice es así, entonces la consulta SQL debe generar algo en la línea de

SELECT [columns] 
FROM Case INNER JOIN CaseInfo 
    ON Case.CaseID = CaseInfo.CaseID 
WHERE CaseInfo.CaseInfoMeta = 'some value' 

¿Ha depurado su consulta LINQ para hacer el SQL generado todavía? ¿Qué devuelve?

+0

perdón por eso ... nuevo en linq. CaseInfo no aparece como miembro de Cases. – madcolor

+0

¿Creó la asociación en el diseñador? ¿Hay una propiedad CaseInfos? – Randolpho

+0

Creé la asociación (parent class = cases, child class = CaseInfo) en CaseID. No hay ningún miembro de CaseInfo que aparezca en Casos. – madcolor

0

Un par de cosas que usted puede intentar:

comprobar las propiedades de la asociación. Asegúrese de que la propiedad Parent se haya creado como Public. Lo hace de forma predeterminada, pero algo puede haber cambiado.

Dado que no está recibiendo CaseInfo en C, intente escribirlo en la otra dirección para ver si obtiene ci.Case con intellisense.

Eliminar y volver a crear la asociación todos juntos.

Hay algo muy básico que va mal si los miembros secundarios no aparecen.Lo mejor sería eliminar el dbml y recrearlo todo.

Si falla todo lo demás, cambie a NHibernate. :)

0

¿Esto es C#? Creo que es necesario == en lugar de = en esta línea:

where c.CaseInfo.CaseInfoMeta = "some value" 

debe leer

where c.CaseInfo.CaseInfoMeta == "some value" 
+0

es, pero eso fue un error en mi publicación (actualizado). Sin embargo, todavía está atascado con el problema. – madcolor

5
CasesDataContext db = new CasesDataContext(); 
var Cases = from c in db.Cases 
      join ci in db.CaseInfo on 
      ci.ID equals c.InfoID 
      where ci.CaseInfoMeta == "some value" 
      select new {CASE=c, INFO=ci}; 

my "join" linq está un poco oxidado, pero lo anterior debería acercarse a lo que está buscando.

0

Después de algunas pruebas, estoy bastante seguro de que las relaciones FK se requieren en la base de datos, independientemente de las asociaciones que se creen en Linq-to-SQL. es decir, si no los tiene configurados explícitamente en el DB, entonces tendrá que hacer un join manualmente.

+0

Actualicé mi respuesta, puede definirla en el diseñador, pero debe asegurarse de que ambas tablas tengan una clave principal (que también se puede hacer en el diseñador, si no puede estar en el DB por algún extraño motivo). – eglasius

+0

Puede definir claves primarias en el diseñador, pero si no existen en las tablas en la base de datos, obtendrá una "especificación de sincronización automática incorrecta para error de miembro". Por lo tanto, el comentario anterior de Freddy es un poco engañoso. – madcolor

+0

ACTUALIZACIÓN: En el diseñador de L2SQL, configuré ambas columnas como claves principales en ambas tablas (CaseID) y desactivé la "sincronización automática" para la columna CaseID en el caso y todo está funcionando. Gracias Freddy. – madcolor

Cuestiones relacionadas