2012-08-09 8 views
29
foreach (var item in order.MyFiles) 
{ 
    var newFile = adapter.db.File.CreateObject(); 

    newFile.Name = item.FileName; 

    adapter.db.File.AddObject(newFile); 

    adapter.db.SaveChanges(); 

    item.MyFile.Add(new MyFile { FileID = newFile.FileID }); 

    adapter.db.SaveChanges(); 
} 

foreach (var item in tempFilesList) 
{ 
    adapter.db.DeleteObject(item); 
} 

adapter.db.SaveChanges(); 

Ese código duplica filas de la tabla MyFile, por ejemplo, si se repite el bucle 3 veces veo 6 filas (3 x 2 * adapter.db.SaveChanges() ???)C# No se puede determinar el fin principal de la relación

Sin embargo, si sólo tengo una sola adapter.db.SaveChanges(); (esto último) me sale el error

No se puede determinar el fin principal de la relación 'my_dbModel.FK_MyFile_File'. Múltiples entidades agregadas pueden tener la misma clave principal.

supongo que se debe a que en ese caso no compromete a los artículos antes de adapter.db.File.AddObject(newFile); assinging a la item.MyFile.Add(new MyFile { FileID = newFile.FileID }); Pero puedo estar equivocado, alguna idea de cómo solucionarlo?

Respuesta

45

No puede usar newFile.FileID al definir un nuevo MyFile antes de guardar los cambios. El FileID es predeterminado (0) hasta que guarde la nueva entidad en la base de datos. Tendría que usar la propiedad de navegación File en su clase MyFile. EF detectará la relación y comprometerá los datos de manera apropiada.

tratar de cambiar la línea item.MyFile.Add(new MyFile { FileID = newFile.FileID }); con:

item.MyFile.Add(new MyFile { File = newFile }); 

donde File es la propiedad de navegación define en MyFile entidad.

+2

Has guardado mi noche, muchas gracias :) – Tony

+0

¡Resolvió mi problema también! – HuckIt

3

Esto podría deberse a una referencia cíclica en usted EDMX a la misma tabla.

Medios, por ejemplo, si EmployeeDepartment es la tabla que va a actualizar y la clave principal es EmployeeDepartmentID y si se trata de una columna de identidad y generado automáticamente, compruebe en el EDMX si se hace referencia al EmployeeDepartmentID. Si es así, haga clic con el botón derecho en la referencia de la tecla anterior y haga clic en Eliminar.

Esto funcionó para mí y espero que esto también funcione para usted.

Gracias,

Bibin.

+0

¿Estás diciendo que NO incluyas la referencia propia? –

Cuestiones relacionadas