2008-12-02 15 views
7

Necesito insertar registros en una tabla que no tiene clave principal usando LINQ to SQL. La mesa está mal diseñada; NO tengo control sobre la estructura de la mesa. La tabla se compone de algunos campos varchar, un campo de texto y una marca de tiempo. Se usa como una pista de auditoría para otras entidades.Inserto de Linq sin clave primaria

¿Cuál es la mejor manera de lograr las inserciones? ¿Podría extender la clase parcial Linq para esta tabla y agregar una clave "falsa"? Estoy abierto a cualquier hack, sin embargo kludgey.

Respuesta

11

LINQ to SQL no está diseñado para esta tarea, por lo tanto, no lo use. Simplemente distorsione la inserción en un procedimiento almacenado y agregue el procedimiento a su modelo de datos. Si no puede hacer eso, escriba una función normal con un poco de SQL en línea.

9

Abra su archivo DBML en el diseñador y proporcione una clave al mapeo, ya sea que su base de datos tenga uno o no. Esto resolverá su problema. Sin embargo, tenga en cuenta que no puede contar con la columna que se utiliza para la identidad o cualquier otra cosa si no hay una clave genuina en la base de datos.

2

Puede usar el método DataContext.ExecuteCommand para ejecutar su propia instrucción de inserción personalizada.

O bien, puede agregar primary key a una columna, esto permitirá objects to be tracked para inserciones/actualizaciones/eliminaciones por el contexto de datos. Esto funcionará incluso si la columna no es realmente una clave principal forzada en la base de datos (¿cómo sabría linq?). Si solo hace inserciones y nunca vuelve a utilizar un valor de clave primaria en el mismo contexto de datos, estará bien.

3

Pude evitar esto usando una clave compuesta.

Tuve un problema similar con una tabla que contiene solo dos columnas: nombre de usuario, función. Esta tabla obviamente no requiere una columna de identidad. Entonces, creé una clave compuesta con nombre de usuario y rol. Esto me permitió usar LINQ para agregar y eliminar entradas.

Cuestiones relacionadas