lista - llenar combobox c# entity framework
¿Cómo aseguro que Linq to Sql no anula ni viola valores predeterminados de DB no anulables? (4)
Tengo un DB de SQL Server con una tabla con estos campos:
- Un
bit
con el valor predeterminado 1,NOT NULL
. - Un
smalldatetime
con el valor predeterminadogettime()
,NOT NULL
. - Un
int
sin valor predeterminado,IDENTITY
,NOT NULL
.
Cuando genero Linq a SQL para esta tabla, sucede lo siguiente:
- La
bit
no recibe un tratamiento especial. - The
smalldatetime
no recibe un tratamiento especial. - El
int
está marcado comoIsDbGenerated
.
Esto significa que cuando realice inserciones utilizando Linq a SQL, ocurrirá lo siguiente:
- El
bit
se enviará como 0, anulando el valor predeterminado. ¿Derecha? - El
smalldatetime
se enviará como unSystem.DateTime
no inicializado, produciendo un error en el servidor SQL, ya que no se corresponde con el rango smalldatetime de SQL Server. ¿Derecha? -
IsDbGenerated
int
no se enviará; el DB generará un valor que Linq to SQL luego volverá a leer.
¿Qué cambios debo hacer para que este escenario funcione?
Para resumir: quiero campos que no IsDbGenerated
valores predeterminados asignados por DB, pero no los quiero IsDbGenerated
si esto significa que no puedo proporcionarles valores cuando IsDbGenerated
actualizaciones o inserciones usando Linq a SQL. Tampoco quiero que sean IsDbGenerated
si esto significa que tengo que modificar manualmente el código generado por Linq a SQL.
EDITAR: La respuesta parece ser que esta es una limitación en el actual Linq a SQL.
Esto significa que cuando realice inserciones utilizando Linq a SQL, ocurrirá lo siguiente:
- El bit se enviará como 0, anulando el valor predeterminado. ¿Derecha? - Correcto
- El smalldatetime se enviará como un System.DateTime no inicializado, produciendo un error en el servidor SQL, ya que no se corresponde con el rango smalldatetime de SQL Server. ¿Derecha? - Lo que se envía es DateTime.MinValue
- IsDbGenerated int no se enviará; el DB generará un valor que Linq to SQL luego volverá a leer. - Si se genera DB generado, entonces el valor es creado por la base de datos; si no, entonces Linq espera que el usuario establezca el valor.
Su mejor opción es establecerlos en el constructor del objeto, o en los campos privados, si no está usando propiedades automáticas.
Puede crear otro archivo para su contexto de datos (clase parcial) y luego usar los métodos parciales InsertYOURENTITY y UpdateYOURENTITY para inspeccionar sus propiedades y asignar los valores adecuados. Llame a ExecuteDynamicInsert o ExecuteDynamicUpdate después de su código y listo.
Me encontré con el mismo problema, bzlm, y llegué a la misma conclusión. Simplemente no hay una buena manera de obtener campos que no admiten nulos con valores predeterminados asignados por DB que funcionen con Linq To Sql.
El trabajo con el que me he ido es agregar un método SetDefaults () muy similar al que Robert Paulson vinculó en CodeProject y llamarlo en el constructor predeterminado de la clase base de mi entidad de tabla. Funciona bien para mí, porque el 95% de las veces, estoy configurando un 0, cadena vacía o getdate ().
Las clases generadas de Linq-To-Sql no recogen los Constriants de valor predeterminado.
Tal vez en el futuro, pero el problema es que las limitaciones no son siempre valores simples, sino que también pueden ser funciones escalares como GetDate()
, por lo que linq de alguna manera tendría que saber cómo traducirlas. En resumen, ni siquiera lo intenta. También es un tipo de cosas muy específicas de la base de datos.
- Puede escribir un generador de código para crear clases parciales de entidad donde puede extraer el valor constriant predeterminado.
- Alternativamente, el código de su capa de negocios podría establecer los valores predeterminados en los constructores a partir de un archivo xml, y todo lo que necesita hacer es mantener el archivo xml actualizado.
- En lugar de hacer el trabajo en constructores, puede emular SQL y agregar valores predeterminados inspeccionando el conjunto de cambios antes de enviar cambios a la base de datos.
El problema que tiene se describe detalladamente en CodeProject - Estableciendo valores predeterminados para LINQ Bound Data