2010-05-24 15 views
5

Estoy intentando hacer un simple inserto con clave externa, pero parece que necesito usar db.SaveChanges() para cada inserción de registro. ¿Cómo puedo administrar el uso de un solo db.SaveChanges() al final de este programa?¿Por qué no puedo insertar registro con clave externa en una sola solicitud de servidor?

public static void Test() 
{ 
    using (var entities = new DBEntities()) 
    { 
     var sale = 
      new SalesFeed 
      { 
       SaleName = "Stuff...", 
      }; 
     entities.AddToSalesFeedSet(sale); 

     var phone = 
      new CustomerPhone 
      { 
       CreationDate = DateTime.UtcNow, 
       sales_feeds = sale 
      }; 
     entities.AddToCustomerPhoneSet(phone); 

     entities.SaveChanges(); 
    } 
} 

Después de ejecutar el código anterior me sale esta excepción:

System.Data.UpdateException: Se ha producido un error al actualizar las entradas. Vea InnerException para más detalles. El valor especificado no es una instancia de una constante válida tipo Nombre del parámetro: valor.

EDIT: Se modificó el código de ejemplo y se agregó la excepción devuelta.

+0

Mostrar más detalles ¿cómo se obtiene la variable "archivo"? –

+0

@Andrew: fuente de archivos agregados. –

+0

Me parece que tienes cosas un poco atrasadas: agregas una entrada a DirectorySet con una referencia al archivo, ¿no debería ser al revés? Un archivo se encuentra dentro de un directorio, por lo que el archivo debe hacer referencia al directorio. ¿Tendría una entrada en el directorio y una cantidad de archivos que haga referencia a eso? –

Respuesta

12

Apperantly usando UNSIGNED BIGINT causa este problema. Cuando cambié a SIGNED BIGINT todo funcionó como se suponía.

+1

Tuve el mismo problema con UNSIGNED INTS usando una entidad con un back-end MySQL. ¿Cuál era tu base de datos? – jwrush

+1

Yo también con MySQL + UNSIGNED BIGINT. –

2

Traté de hacer esto "el camino correcto":

alt text http://i45.tinypic.com/mcw5co.png

Y entonces me escribió esta aplicación de prueba pequeña para escanear un directorio, almacenar el directorio y todos sus archivos en dos tablas:

static void Main(string[] args) 
{ 
    string directoryName = args[0]; 

    if(!Directory.Exists(directoryName)) 
    { 
     Console.WriteLine("ERROR: Directory '{0}' does not exist!", directoryName); 
     return; 
    } 

    using (testEntities entities = new testEntities()) 
    { 
     StoredDir dir = new StoredDir{ DirName = directoryName }; 
     entities.AddToStoredDirSet(dir); 

     foreach (string filename in Directory.GetFiles(directoryName)) 
     { 
     StoredFile stFile = new StoredFile { FileName = Path.GetFileName(filename), Directory = dir }; 
     entities.AddToStoredFileSet(stFile); 
     } 

     try 
     { 
     entities.SaveChanges(); 
     } 
     catch(Exception exc) 
     { 
     string message = exc.GetType().FullName + ": " + exc.Message; 
     } 
    } 
} 

Como puede ver, solo tengo una sola llamada al .SaveChanges() al final - esto funciona como un encanto, todo es como se esperaba.

algo acerca de su enfoque debe ser arruinando el sistema EF .....

+0

Bien, lo verificaré y te responderé con los resultados. Gracias. –

+0

Lo he intentado, pero una vez más se arrojó una excepción (vea la pregunta actualizada). –

Cuestiones relacionadas