Principales respuestas
Uso de sequence en una tabla. y consumirla desde Entity Framework

Pregunta
-
Buenas tardes estimados,
tengo problemas con una secuencia (Sequence) esto fue lo que hice
CREATE TABLE tblLibroCompras ( Id int identity(1,1), FechaMovimiento datetime not null, UsuarioId int not null, NumeroExpediente bigint not null CONSTRAINT PK_tblDetalleGastosEgresos PRIMARY KEY (Id) CONSTRAINT FK_tblMaestroGastosEgresos_tblUsuarios FOREIGN KEY(UsuarioId) REFERENCES tblUsuarios(Id) ); GO
ahora., hice esta secuencia y la inice en 26 ya que los numeros anteriores los ingreso desde un insert desde SQL, los demás los ingresare desde la aplicación.
create SEQUENCE EnumeradorMaestroGastosEgreso AS bigint START WITH 26 INCREMENT BY 1 ; go alter table tblMaestroGastosEgresos add CONSTRAINT secuencia default (next value for EnumeradorMaestroGastosEgreso) for NumeroExpediente
bueno, resulta que ya tengo los datos ingresados y efectivamente el ultimo es 25, ahora ejecuto mi sentencia y creo mi sequence, pero desde mi aplicación no cambia, me sale un error que dice que el campo NumeroExpediente no acepta nulos, lo cual es lógico, pero yo pensaba que con esta linea de código se me aumentaría al insertar un dato desde mi aplicación
default (next value for EnumeradorMaestroGastosEgreso) for NumeroExpediente
intente agregando el identity(1,1) a mi columna NumeroExpediente
numeroExpediente identity(1,1) not null,
pero no me deja agregar dos identity en mi tabla.
por favor como resuelvo mi problema. todos los ejemplos que hay solo muestran a nivel sql server no hay un ejemplo con Entity framework, porque yo estoy trabajando con EF.
por favor alguien me puede ayudar.
les agradezco por la ayuda.
RM
Respuestas
-
Estimado Alberto, lo que Ud. me dice me llevo a ver en las propiedades del modelo entonces llegue a esta conclusión, que no necesite de agregar la linea
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
solamente hice este cambio en el modelo y funciona,
y eso fue todo, ahora espero que esta sea la solución a mi problema, la opcion StoreGeneratedPattern estaba en un inicio en None
Estimado si hay algo mas que acotar me gustaría saberlo, de no ser así, muchas gracias.
Roberto
- Marcado como respuesta Roberto C. Melgar miércoles, 8 de julio de 2020 21:13
Todas las respuestas
-
El error te sale porque EF no "sabe" que ese campo tiene un default que se genera con la secuencia, y en consecuencia intenta enviar un valor a grabar. Y como en memoria no tiene nada en ese campo, envía un NULL, y entonces éste suplanta el default y da un error.
El remedio es decirle a EF que no debe enviar un valor para ese campo. Para conseguir esto, tienes que buscar donde tienes definida la clase con el modelo de datos para esa tabla, y decorar con un atributo la propiedad que representa ese campo:
using System.ComponentModel.DataAnnotations.Schema; // ... public class tblLibroCompras { // ... [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public int NumeroExpediente { get; set; } // ... }
-
Estimado Alberto Poblacion
de antemano muchas gracias, hice como se me indico.
public int Id { get; set; } public System.DateTime FechaMovimiento { get; set; } public int UsuarioId { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public long NumeroExpediente { get; set; }
si bien ya no hay el error, en la base de datos no se incremanta el valor, todos me salen el numero (0), osea no se incrementa
cual mas puede ser el problema por favor.
gracias
RM
-
Estimado Alberto, lo que Ud. me dice me llevo a ver en las propiedades del modelo entonces llegue a esta conclusión, que no necesite de agregar la linea
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
solamente hice este cambio en el modelo y funciona,
y eso fue todo, ahora espero que esta sea la solución a mi problema, la opcion StoreGeneratedPattern estaba en un inicio en None
Estimado si hay algo mas que acotar me gustaría saberlo, de no ser así, muchas gracias.
Roberto
- Marcado como respuesta Roberto C. Melgar miércoles, 8 de julio de 2020 21:13