mvc - ADO.NET Entity Framework y columnas de identidad
entity framework tutorial español (10)
¿Conoce el Entity Framework las columnas de identidad?
Estoy usando SQL Server 2005 Express Edition y tengo varias tablas donde la clave principal es una columna de identidad. cuando utilizo estas tablas para crear un modelo de entidad y uso el modelo junto con un enlace de fuente de datos de entidad a una vista de formulario para crear una nueva entidad, se me pide que ingrese un valor para la columna de identidad. ¿Hay alguna manera de que el marco no solicite valores para las columnas de identidad?
Debe establecer la especificación de identidad de las columnas de identidad para que la propiedad (Is Identity) se establezca en verdadero. Puede hacer esto en su diseñador de tablas en SSMS. Entonces puede necesitar actualizar el modelo de datos de la entidad.
Tal vez eso a lo que se refiere al decir que la "clave principal es una columna de identidad", o quizás te perdiste este paso.
El marco de la entidad no comprende completamente las identidades por algún motivo. La solución correcta es establecer Setter para esa columna en Private. Esto hará que cualquier UI generada comprenda que no debe establecer el valor de identidad ya que es imposible que establezca un campo privado.
En C # puedes hacer algo como esto para que esté al tanto:
En su FooConfiguration.cs : EntityTypeConfiguration<Foo>
:
this.Property(x => x.foo).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Luego, para usarlo, solo asegúrese de insertar el elemento en el contexto y llame a context.SaveChanges()
antes de usar x.foo
para obtener el valor auto-incrementado actualizado. De x.foo
contrario, x.foo
solo será 0 o nulo.
Entity Framework es consciente y puede manejar columnas de identidad.
Tu problema puede ser tal vez no el EF en sí mismo sino la forma de vista generada de él. Intente eliminar la entrada de la columna de identidad del formulario de inserción y veamos qué sucede.
Esta es la mejor respuesta que he visto. StoreGeneratedPattern="Identity"
editar manualmente la capa de almacenamiento xml para establecer StoreGeneratedPattern="Identity"
en cada clave principal de tipo UniqueIdentifier
que tenga el valor predeterminado establecido en NewID()
.
Lo que funcionó para mí fue configurar StoreGeneratedPattern en None, cuando era una columna de Identity. Ahora todo funciona de manera consistente. El principal problema con esto es la edición de los modelos es una tarea extrema si tiene muchos modelos.
No puedo creerlo. Intellisensing ItemCollection proporciona el único elemento con ID = 0 después de SaveChanges.
Dim ItemCollection = From d In action.Parameter
Select New STOCK_TYPE With {
.Code = d.ParamValue.<Code>.Value,
.GeneralUseID = d.ParamValue.<GeneralUse>.Value,
}
GtexCtx.STOCK_TYPE.AddObject( ItemCollection.FirstOrDefault)
GtexCtx.SaveChanges()
No importa lo que yo haga. Después de 8 horas, incluyendo la eliminación de mi modelo, 35 veces la construcción y reconstrucción, la experimentación y edición del XML de EDMX y ahora casi llegando a eliminar toda mi base de datos de SQL Server. En la compilación número 36, esta solución tan asombrosa funcionó
Dim abc = ItemCollection.FirstOrDefault
GtexCtx.STOCK_TYPE.AddObject(abc)
GtexCtx.SaveChanges()
abc.ID rendimiento 41 (la identidad que necesitaba)
EDITAR: Aquí hay un código simple para pensar para poner en bucle AddObject y aún obtener ID
Dim listOfST As List(Of STOCK_TYPE) = ItemCollection.ToList()
For Each q As STOCK_TYPE In listOfST
GtexCtx.STOCK_TYPE.AddObject(q)
Next
GtexCtx.SaveChanges()
...more code for inter-relationship tables
Pruebe Intellisence listOfST después de SaveChanges y encontrará ID actualizada. Tal vez hay una mejor manera, pero el concepto está ahí
Si está utilizando Entity Framework 5, puede usar el siguiente atributo.
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
Si todo lo demás falla antes de arrancarle el pelo, intente eliminar su EntityModel y volver a importarlo desde SQL Server. Si ha estado retocando las claves y las relaciones y confiando en la función ''actualizar el modelo desde la base de datos'', sigue teniendo errores en la versión RC que he encontrado; una importación nueva puede ser útil.
Sé que esta publicación es bastante antigua, pero esto puede ayudar a la próxima persona que llega a escuchar a través de una búsqueda en Google de "Entitiy Framework" e "Identity".
Parece que Entity Frameworks respeta las claves primarias generadas por el servidor, como sería el caso si se establece la propiedad "Identity". Sin embargo, el modelo del lado de la aplicación aún requiere que se proporcione una clave primaria en el método CreateYourEntityHere
. La clave especificada aquí se descarta al realizar la llamada SaveChanges()
al contexto.
La página here brinda información detallada al respecto.