2008-09-23 25 views
48

¿El Entity Framework conoce las columnas de identidad?ADO.NET Entity Framework y 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?

Respuesta

2

Entity Framework es consciente y puede manejar columnas de identidad.

Su problema puede ser tal vez no el EF en sí mismo sino la vista de formulario generada de él. Intente eliminar la entrada de la columna de identidad del formulario de inserción y veamos qué sucede.

4

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.

Quizás eso a lo que se refiere al decir que la "clave principal es una columna de identidad" o tal vez se haya perdido este paso.

2

Si todo lo demás falla antes de que le arranque el pelo, intente eliminar EntityModel y volver a importar 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.

+0

Esto sigue siendo cierto 7 años después. Actualizar no fue recoger mis cambios clave. Crear un nuevo modelo resolvió el problema. – nunzabar

67

Sé que esta publicación es bastante antigua, pero esto puede ayudar a la siguiente 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 suministre una clave principal en el método CreateYourEntityHere. La clave especificada aquí se descarta al llamar al contexto SaveChanges().

La página here proporciona la información detallada al respecto.

1

Entidad marco no entiende completamente las identidades por alguna razón. 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.

+0

En este caso, no podrá editar la entidad a través de la clave, ya que el valor será 0 para el objeto actualizado y no podrá guardar los cambios actualizados como no puede encontrar el objeto en la colección a través de la clave. (Este caso es para MVC) – Chinjoo

0

Lo que funcionó para mí fue configurar el StoreGeneratedPattern en Ninguno, cuando se trataba de una columna de Identidad. 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.

3

Esta es la mejor respuesta que he visto. Debe 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().

http://web.archive.org/web/20130728225149/http://leedumond.com/blog/using-a-guid-as-an-entitykey-in-entity-framework-4/

+0

Después de leer este consejo, encontré que se había agregado una identidad faltante, pero EF necesitaba dejar caer y actualizar el objeto en el modelo de datos de la entidad para arreglar todo. – goosemanjack

0

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 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 36a, esta solución dumbfounding trabajó

  Dim abc = ItemCollection.FirstOrDefault 
      GtexCtx.STOCK_TYPE.AddObject(abc) 
      GtexCtx.SaveChanges() 

abc.ID un rendimiento del 41 (la identidad que necesitaba)

EDIT: He aquí un simple código de reflexión para AddObject bucle y aún así 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á la ID actualizada. Tal vez hay una mejor manera, pero el concepto es que hay

2

En C# se puede hacer algo como esto para que sea consciente de:

En su FooConfiguration.cs : EntityTypeConfiguration<Foo>:

this.Property(x => x.foo).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

después utilizarla, sólo asegúrese de inserte el elemento en el contexto y llame al context.SaveChanges() antes de usar x.foo para obtener el valor actualizado autoincrementado. De lo contrario, x.foo será 0 o nulo.

5

Si está utilizando Entity Framework 5, puede usar el siguiente atributo.

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
Cuestiones relacionadas