using (var ctx = new Model.VMcontext())
{
List<Model.Process> Pr = new List<Model.Process>();
Model.Process pp;
foreach (RemoteProcess item in queueItem.rp)
{
pp = new Model.Process(item.ProcName, item.Procstatus, item.Timestamp, item.mcName);
Pr.Add(pp);
}
VM vm = new VM(queueItem.VM_Hostname, queueItem.Disks ,queueItem.VMstatus, Pr);
// compare vm object ref with current db objects
// If VM not present, insert VM
VM DBvm = ctx.VirtualMachines.Find(vm.VM_Hostname);
if (DBvm==null)
{
ctx.VirtualMachines.Add(vm);
}
// else VM exists so, update it [ERROR OCCURS HERE]
else
{
//DBvm = vm;
//ctx.Entry(vm).State = EntityState.Modified; I tried various update methods too
DBvm.disks = vm.disks;
DBvm.Processes = vm.Processes;
DBvm.VMstatus = vm.VMstatus;
}
ctx.SaveChanges();
}
Quando aggiorno un record esistente, viene generata un'eccezione. Ho cercato altre risposte qui, ma nessuna sembra aiutare.
Un'eccezione di tipo "System.Data.Entity.Infrastructure.DbUpdateException" si è verificata in EntityFramework.dll ma non è stata gestita nel codice utente
Ulteriori informazioni: si è verificato un errore durante l'aggiornamento delle voci. Vedi l'eccezione interna per i dettagli.
Dove sto andando male ??
modifica Come suggerito, ha esaminato le eccezioni interne e dice che sto cercando di inserire un valore duplicato 'C:' nella tabella del disco. Ma non sto inserendo alcun dato, sto solo trovando il record esistente e aggiornandolo. Non sono sicuro di come ottenere l'errore di duplicazione della chiave primaria *
MODIFICA 2
public class VM
{
public VM(string host,List<Disk>d ,int stat,List<Process> procs)
{
VM_Hostname = host;
disks = d;
VMstatus = stat;
Processes = procs;
}
public VM() { }
[Key]
public string VM_Hostname { get; set; }
public int VMstatus { get; set; }
public virtual ICollection<Model.Process> Processes { get; set; }
public virtual List<Disk> disks { get; set; }
}
public class Process
{
public Process(string pname,int stat,DateTime d, string vm )
{
ProcessName = pname;
status = stat;
date = d;
VM_hostname = vm;
}
public Process() { }
[Key]
public string ProcessName { get; set; }
public int status { get; set; }
public DateTime date { get; set; }
public string VM_hostname { get; set; }
[ForeignKey("VM_hostname")]
public virtual Model.VM vm { get; set; }
}
public class Disk
{
[Key]
public string name { get; set; }
public double freeSpace { get; set; }
public double freePercent { get; set; }
public double totalSpace { get; set; }
public double used { get; set; }
public string VM_hostname { get; set; }
[ForeignKey("VM_hostname")]
public virtual Model.VM vm { get; set; }
}
Come ho accennato nel mio commento, il tuo problema è che stai usando un elenco di oggetti Disk
e Process
che sono stati creati prima che il contesto attuale fosse creato. Pertanto, il contesto non li conosce e quando si sostituisce l'elenco di oggetti Disk
e Process
sull'entità VM
, il contesto presuppone che siano tutti nuovi elementi e tenta di aggiungerli al database. Ma dal momento che non sono nuovi elementi, esistono conflitti di chiave primaria che causano l'eccezione che stai vedendo.
Per risolvere il problema, è necessario collegare gli oggetti Disk
e Process
al contesto prima di salvarli.
Per esempio:
VM DBvm = ctx.VirtualMachines.Find(vm.VM_Hostname);
if (DBvm==null)
{
ctx.VirtualMachines.Add(vm);
}
// else VM exists so, update it [ERROR OCCURS HERE]
else
{
//DBvm = vm;
//ctx.Entry(vm).State = EntityState.Modified; I tried various update methods too
foreach (var disk in vm.disks)
{
//Only attach if the entity already exists, otherwise just let it get added.
if (ctx.Disks.Find(disk) != null)
{
ctx.Disks.Attach(disk);
ctx.Entry(disk).State = EntityState.Modified;
}
}
foreach (var process in vm.Processes)
{
if (ctx.Processes.Find(process) != null)
{
ctx.Processes.Attach(process);
ctx.Entry(process).State = EntityState.Modified;
}
}
DBvm.disks = vm.disks;
DBvm.Processes = vm.Processes;
DBvm.VMstatus = vm.VMstatus;
}
L'aggiunta dei loop per collegare le entità dovrebbe risolvere l'eccezione, poiché indica il contesto di questi oggetti e impostando il loro stato su modificato significa che non sono nuovi e che dovrebbero essere aggiornati, anziché inseriti.