2010-05-24 6 views
5

Sto cercando di inserire un semplice inserto con chiave esterna, ma sembra che sia necessario utilizzare db.SaveChanges() per ogni inserto del record. Come posso utilizzare un solo db.SaveChanges() alla fine di questo programma?Perché non posso inserire record con chiave esterna in una richiesta di singolo server?

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(); 
    } 
} 

Dopo aver eseguito il codice di cui sopra ottengo questa eccezione:

System.Data.UpdateException: Si è verificato un errore durante l'aggiornamento delle voci. Vedi l'InnerException per i dettagli. Il valore specificato non è un'istanza di un tipo di costante valido Nome parametro: valore.

MODIFICA: Codice di esempio modificato e aggiunta eccezione restituita.

+0

Mostra ulteriori dettagli su come si ottiene la variabile "file"? –

+0

@Andrew: aggiunta fonte variabile di file. –

+0

Mi sembra che tu abbia un po 'di ritardo - aggiungi una voce a DirectorySet con un riferimento al file - non dovrebbe essere il contrario? Un file si trova all'interno di una directory - quindi il file dovrebbe fare riferimento alla directory - avresti una voce Directory e un numero qualsiasi di file che fanno riferimento a tale ?? –

risposta

12

Apperantly usando UNSIGNED BIGINT causa questo problema. Quando sono passato a SIGNED BIGINT, tutto ha funzionato come previsto.

+1

Ho avuto lo stesso problema con INTS UNSIGNED utilizzando entità con un backend MySQL. Qual era il tuo database? – jwrush

+1

Anch'io con MySQL + UNSIGNED BIGINT. –

2

Ho provato a fare questo "nel modo giusto":

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

E poi ho scritto questo piccolo test applicazione per eseguire la scansione di una directory, memorizzare la directory e tutti i suoi file in due tabelle:

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; 
     } 
    } 
} 

come potete vedere, ho solo una singola chiamata a .SaveChanges() proprio alla fine - questo funziona come un fascino, tutto è come previsto.

qualcosa circa il vostro approccio deve essere avvitamento del sistema EF .....

+0

OK, lo controllerò e tornerò da te con i risultati. Grazie. –

+0

L'ho provato, ma ancora una volta è stata lanciata un'eccezione (vedi domanda aggiornata). –

Problemi correlati