2009-06-17 18 views
14

Estoy intentando aprender a usar el marco Entity pero he encontrado un problema que no puedo resolver. Lo que estoy haciendo es que estoy repasando una lista de películas que tengo e inserto cada una en una base de datos simple.InvalidOperationException al llamar a SaveChanges en .NET Entity framework

Este es el código que estoy usando

private void AddMovies(DirectoryInfo dir) 
{ 
    MovieEntities db = new MovieEntities(); 
    foreach (DirectoryInfo d in dir.GetDirectories()) 
    { 
     Movie m = new Movie { Name = d.Name, Path = dir.FullName }; 
     db.AddToMovies(movie); 
    } 
    db.SaveChanges(); 
} 

Cuando hago esto me da una excepción en db.SaveChanges() que leen.

Los cambios en la base de datos fueron cometido con éxito, pero se produjo un error al actualizar el objeto contexto. ObjectContext podría estar en un estado incoherente. Excepción interna mensaje: Aceptar cambios no puede continuar porque los valores clave del objeto entran en conflicto con otro objeto en ObjectStateManager. Asegúrese de que los valores de las claves sean únicos antes de llamar al AceptarCambios.

No he podido encontrar la causa de este problema. Mi tabla de base de datos contiene tres columnas
Id int autoincrement
Nombre nchar (255)
Ruta nchar (255)

Actualización: revisé mi archivo edmx y la sección SSDL tienen la StoreGeneratedPattern = "Identidad", como sugirió. También seguí la publicación del blog e intenté agregar ClientAutoGenerated = "true" y StoreGenerated = "true" en el CSDL como se sugiere allí. Esto dio como resultado errores de compilación (Error 5: el atributo 'ClientAutoGenerated' no está permitido). Como la publicación del blog es de 2006 y tiene un enlace a una publicación de seguimiento, asumo que ha sido modificada.

Sin embargo, no puedo leer la publicación de seguimiento ya que parece requerir una cuenta msdn.

+1

La respuesta para mí fue establecer 'StoreGeneratedPattern =" Identity "' en la propiedad, [ver aquí para más detalles] (http://www.matthewedmondson.info/2012/09/entity-framework-and. html). –

+0

También ocurre cuando utiliza asignaciones de SotredProcedure para INSERT, UPDATE, DELETE y su clave de ID es una clave calculada dentro del SP. –

Respuesta

10

he encontrado la solución a esto.

Lo que sucedió fue que cuando creé mi tabla olvidé agregar la clave principal y establecer la propiedad (Es identidad) en sí. Luego creé mi modelo de Entidad y obtuve este error.

Volví y arreglé la tabla de mi base de datos, pero todavía tengo la extraña excepción. Lo que resolvió el problema al final fue eliminar la entidad y volver a crearla después de que se arregló la tabla.

excepciones No más :)

6

Esta excepción parece indicarle que tiene valores iguales en varias filas en la columna Id, que se supone que solo tiene valores únicos, porque es una columna de clave. Entity Framework puede manejar dichas columnas de dos maneras: o bien usted (el Cliente) genera valores únicos, o el Servidor genera valores únicos. En su caso, parece lógico permitir que el Servidor genere claves autoincrementadas.

¿Tiene la clave StoreGeneratedPattern establecida para la columna Id en su archivo SSDL?

Aquí se muestra un ejemplo de this blogpost:

<EntityType Name="rooms" Key="id"> 
    <Property Name="id" Type="int" Nullable="false" 
       StoreGeneratedPattern="Identity" /> 
    <Property Name="name" Type="nvarchar" Nullable="false" MaxLength="50" /> 
</EntityType> 
+0

En EF4 es "Identidad" en lugar de "identidad" –

+1

@XMLforDummies: gracias, ¡actualicé la respuesta! –

+0

¡Gracias! Este problema me ha estado volviendo loco durante la última semana más o menos. Aunque tuve que editar manualmente el archivo. Al cambiarlo en las propiedades solo se agregó una marca de anotación. – Htbaa

1

si ha ligado una BindingSource, debe llamar a la suspendbinding:

 bs.SuspendBinding(); 
     Data.SaveChanges(); 
     bs.ResumeBinding(); 
7

última vez que probé el código siguiente y me dijo que está trabajando bien

bs.SuspendBinding(); 
Data.SaveChanges(); 
bs.ResumeBinding(); 

Las cosas importantes que me wana te digo hoy son que:

1- Si usamos el código anterior para suspender el enlace, tenemos que hacer más código para corregir una gran cantidad de escenarios como índice perdido en las colecciones y los enlaces de detalles maestros

2- si usamos el siguiente código en lugar del por encima de código veremos la excepción desaparecido y todo irá bien donde no hay necesidad de escribir código más

 Data.SaveChanges(System.Data.Objects.SaveOptions.None); 

espero que esto resuelve sus problemas similares

gracias amigos

+0

Nota: System.Data.Objects.SaveOptions.None solo está disponible en .Net 4.0. – sfuqua

+1

Puede ser solo .Net 4.0, pero SaveOptions.None funcionó muy bien para mí con este mismo problema. –

+0

¿qué uso en EF5 o 6? ¿Hay alguna opción equivalente porque estoy obteniendo un problema similar? gracias – lawphotog

2
System.Data.Objects.SaveOptions.None 

Esto resuelve el problema pero me pregunto cuál es la diferencia entre deshacer ninguna u otras opciones.

0

Compruebe si las claves principales no están presentes en ninguna de sus etities, en caso afirmativo, crearlos, y hacer el "UpdateModel de base de datos"

esto debería resolver el problema

0

También Compruebe si ha fijado la propiedad "Is Identity" para otra columna es "yes" y está insertando un valor duplicado en ella.

0

Tuve el problema similar con la relación de tabla que abarca tres niveles Como Cliente-> Pedido-> Detalles de pedidos con el disparador automático de identidad 12C de oracle para la generación de claves. La inserción con SaveChanges() arrojaba System.InvalidOperationException.

Solución: La función de aumento SaveChanges(System.Data.Objects.SaveOptions.None) impide que el sistema use temporalmente EntityKeys en el estado del gráfico de objeto y en la excepción de resultado se evita.

+2

Esta no es la respuesta a la pregunta. Si tiene un problema similar, puede publicar otra pregunta. Consulte [Cómo escribir una buena respuesta] (http://stackoverflow.com/help/how-to-answer) –

Cuestiones relacionadas