asp.net mvc - EF - Item Removed From Collection But Not From Database -


running strange issue. i'm using following code manage collection form:

    public void updatelinks(eventviewmodel form)     {         var selectedids = form.links.select(r => r.resourcetypeid).tolist();         var assignedids = form.event.links.select(r => r.resourcetypeid).tolist();         foreach (var resource in form.links)         {             resource.eventid = form.event.id;             if (!assignedids.contains(resource.resourcetypeid))                 form.event.links.add(resource);         }         foreach (var resource in form.event.links.tolist())         {             if (!selectedids.contains(resource.resourcetypeid))                 form.event.links.remove(resource);         }     } 

the code updating links collection , reflected correctly in view, not removing child record database table. means if remove collection item , go add 1 again have same composite key, following exception thrown:

system.data.sqlclient.sqlexception: violation of primary key constraint 'pk_dbo.eventresource'. cannot insert duplicate key in object 'dbo.eventresource'. duplicate key value (1, 1). statement has been terminated.

other pertinent info:

event controller

[httppost] public actionresult edit(eventviewmodel form, httppostedfilebase[] eventfiles) {     if (modelstate.isvalid)     {         eventsservice.updateevent(form.event);         eventsservice.updatemanufacturertags(form);         eventsservice.updatefiles(form, eventfiles);         eventsservice.updatelinks(form);         eventsservice.save();         return redirecttoaction("details", new { id = form.event.id });     }     return view(form); } 

event

public class event {     [key]     public int id { get; set; }      [required]     public string title { get; set; }      [required]     [displayname("start time")]     [displayformat(applyformatineditmode = true, dataformatstring = "{0:m/d/yyyy h:mm tt}")]     public datetime? starttime { get; set; }      [required]     [displayname("end time")]     [displayformat(applyformatineditmode = true, dataformatstring = "{0:m/d/yyyy h:mm tt}")]     public datetime? endtime { get; set; }      public string venue { get; set; }      public string address { get; set; }      public string city { get; set; }      public string state { get; set; }      public string zip { get; set; }      [allowhtml]     [datatype(datatype.multilinetext)]     public string description { get; set; }      [displayname("registration link")]     public string registrationurl { get; set; }      public virtual ilist<manufacturer> manufacturers { get; set; }      public virtual ilist<eventresource> files { get; set; }      public virtual ilist<eventresource> links { get; set; }      public ienumerable<eventresource> resources     {         { return files.concat(links); }     }      public string longstartdate     {         { return starttime.value.tolongdatestring(); }     }      public string shortstartdate     {         { return starttime.value.toshortdatestring(); }     }      public string shortstarttime     {         { return starttime.value.toshorttimestring(); }     }      public string longenddate     {         { return endtime.value.tolongdatestring(); }     }      public string shortenddate     {         { return endtime.value.toshortdatestring(); }     }      public string shortendtime     {         { return endtime.value.toshorttimestring(); }     }      public event()     {         manufacturers = new list<manufacturer>();         files = new list<eventresource>();         links = new list<eventresource>();     } } 

event resource

public class eventresource {     [key, column(order = 0)]     public int eventid { get; set; }      [key, column(order = 1)]     public int resourcetypeid { get; set; }      public string path { get; set; }      public virtual event event { get; set; }      public virtual resourcetype type { get; set; } } 

resource type

public class resourcetype {        [key]     public int id { get; set; }      [required]     public string name { get; set; } } 

pertinent lines context class

public dbset<event> events { get; set; } public dbset<eventresource> eventresources { get; set; } public dbset<resourcetype> resourcetypes { get; set; } 

stack trace

[sqlexception (0x80131904): violation of primary key constraint 'pk_dbo.eventresource'. cannot insert duplicate key in object 'dbo.eventresource'. duplicate key value (1, 1). statement has been terminated.]    system.data.sqlclient.sqlconnection.onerror(sqlexception exception, boolean breakconnection, action`1 wrapcloseinaction) +1788622    system.data.sqlclient.sqlinternalconnection.onerror(sqlexception exception, boolean breakconnection, action`1 wrapcloseinaction) +5377458    system.data.sqlclient.tdsparser.throwexceptionandwarning(tdsparserstateobject stateobj, boolean callerhasconnectionlock, boolean asyncclose) +244    system.data.sqlclient.tdsparser.tryrun(runbehavior runbehavior, sqlcommand cmdhandler, sqldatareader datastream, bulkcopysimpleresultset bulkcopyhandler, tdsparserstateobject stateobj, boolean& dataready) +1691    system.data.sqlclient.sqlcommand.finishexecutereader(sqldatareader ds, runbehavior runbehavior, string resetoptionsstring) +269    system.data.sqlclient.sqlcommand.runexecutereadertds(commandbehavior cmdbehavior, runbehavior runbehavior, boolean returnstream, boolean async, int32 timeout, task& task, boolean asyncwrite, sqldatareader ds) +1406    system.data.sqlclient.sqlcommand.runexecutereader(commandbehavior cmdbehavior, runbehavior runbehavior, boolean returnstream, string method, taskcompletionsource`1 completion, int32 timeout, task& task, boolean asyncwrite) +177    system.data.sqlclient.sqlcommand.internalexecutenonquery(taskcompletionsource`1 completion, string methodname, boolean sendtopipe, int32 timeout, boolean asyncwrite) +205    system.data.sqlclient.sqlcommand.executenonquery() +160    system.data.mapping.update.internal.dynamicupdatecommand.execute(updatetranslator translator, entityconnection connection, dictionary`2 identifiervalues, list`1 generatedvalues) +535    system.data.mapping.update.internal.updatetranslator.update(ientitystatemanager statemanager, ientityadapter adapter) +262  [updateexception: error occurred while updating entries. see inner exception details.]    system.data.mapping.update.internal.updatetranslator.update(ientitystatemanager statemanager, ientityadapter adapter) +444    system.data.entityclient.entityadapter.update(ientitystatemanager entitycache) +146    system.data.objects.objectcontext.savechanges(saveoptions options) +571    system.data.entity.internal.internalcontext.savechanges() +114  [dbupdateexception: error occurred while saving entities not expose foreign key properties relationships. entityentries property return null because single entity cannot identified source of exception. handling of exceptions while saving can made easier exposing foreign key properties in entity types. see innerexception details.]    system.data.entity.internal.internalcontext.savechanges() +200    system.data.entity.internal.lazyinternalcontext.savechanges() +33    system.data.entity.dbcontext.savechanges() +20    pennlighting.dal.eventsservice.save() in c:\users\dom\documents\github\pennlighting\pennlighting\dal\services\eventsservice.cs:164 pennlighting.controllers.eventscontroller.edit(eventviewmodel form, httppostedfilebase[] eventfiles) in c:\users\dom\documents\github\pennlighting\pennlighting\controllers\eventscontroller.cs:146 lambda_method(closure , controllerbase , object[] ) +125    system.web.mvc.actionmethoddispatcher.execute(controllerbase controller, object[] parameters) +14    system.web.mvc.reflectedactiondescriptor.execute(controllercontext controllercontext, idictionary`2 parameters) +182    system.web.mvc.controlleractioninvoker.invokeactionmethod(controllercontext controllercontext, actiondescriptor actiondescriptor, idictionary`2 parameters) +27    system.web.mvc.async.<>c__displayclass42.<begininvokesynchronousactionmethod>b__41() +28    system.web.mvc.async.<>c__displayclass8`1.<beginsynchronous>b__7(iasyncresult _) +10    system.web.mvc.async.wrappedasyncresult`1.end() +50    system.web.mvc.async.asynccontrolleractioninvoker.endinvokeactionmethod(iasyncresult asyncresult) +32    system.web.mvc.async.<>c__displayclass39.<begininvokeactionmethodwithfilters>b__33() +58    system.web.mvc.async.<>c__displayclass4f.<invokeactionmethodfilterasynchronously>b__49() +225    system.web.mvc.async.<>c__displayclass37.<begininvokeactionmethodwithfilters>b__36(iasyncresult asyncresult) +10    system.web.mvc.async.wrappedasyncresult`1.end() +50    system.web.mvc.async.asynccontrolleractioninvoker.endinvokeactionmethodwithfilters(iasyncresult asyncresult) +34    system.web.mvc.async.<>c__displayclass2a.<begininvokeaction>b__20() +24    system.web.mvc.async.<>c__displayclass25.<begininvokeaction>b__22(iasyncresult asyncresult) +99    system.web.mvc.async.wrappedasyncresult`1.end() +50    system.web.mvc.async.asynccontrolleractioninvoker.endinvokeaction(iasyncresult asyncresult) +27    system.web.mvc.<>c__displayclass1d.<beginexecutecore>b__18(iasyncresult asyncresult) +14    system.web.mvc.async.<>c__displayclass4.<makevoiddelegate>b__3(iasyncresult ar) +23    system.web.mvc.async.wrappedasyncresult`1.end() +55    system.web.mvc.controller.endexecutecore(iasyncresult asyncresult) +39 system.web.mvc.async.<>c__displayclass4.<makevoiddelegate>b__3(iasyncresult ar) +23    system.web.mvc.async.wrappedasyncresult`1.end() +55    system.web.mvc.controller.endexecute(iasyncresult asyncresult) +29    system.web.mvc.controller.system.web.mvc.async.iasynccontroller.endexecute(iasyncresult asyncresult) +10    system.web.mvc.<>c__displayclass8.<beginprocessrequest>b__3(iasyncresult asyncresult) +25    system.web.mvc.async.<>c__displayclass4.<makevoiddelegate>b__3(iasyncresult ar) +23    system.web.mvc.async.wrappedasyncresult`1.end() +55    system.web.mvc.mvchandler.endprocessrequest(iasyncresult asyncresult) +31    system.web.mvc.mvchandler.system.web.ihttpasynchandler.endprocessrequest(iasyncresult result) +9    system.web.callhandlerexecutionstep.system.web.httpapplication.iexecutionstep.execute() +9657028    system.web.httpapplication.executestep(iexecutionstep step, boolean& completedsynchronously) +155  version information: microsoft .net framework version:4.0.30319; asp.net version:4.0.30319.18213 

changed

form.event.links.remove(resource); 

to

context.eventresources.remove(resource); 

and works... weird don't have on other part of site manage collections same way it.


Comments

Popular posts from this blog

c# - Send Image in Json : 400 Bad request -

jquery - Fancybox - apply a function to several elements -

An easy way to program an Android keyboard layout app -