c# - EntityFramework StackOverflowException calling Dbset.Attach -


we hitting stackoverflowexception when using entityframework in production, not in our testing suite. when increase stack size 1mb 50mb, stack overflow disappears, have simple set of tables. suspect simple can solve configuring our entityframework relationships in different manner.

basically, deleting single item database, data set big fit memory (100k+ items, several gb on disk). read best method attach object first, delete it, save.

this results in stack overflow this

(many more similar lines snipped) system.data.entity.core.objects.dataclasses.relatedend.includeentity(system.data.entity.core.objects.internal.ientitywrapper wrappedentity, bool addrelationshipasunchanged, bool doattach) line 1823    c# system.data.entity.core.objects.dataclasses.entityreference<objectidentifier>.include(bool addrelationshipasunchanged, bool doattach) line 346 c# system.data.entity.core.objects.dataclasses.relatedend.walkobjectgraphtoincludeallrelatedentities(system.data.entity.core.objects.internal.ientitywrapper wrappedentity, bool addrelationshipasunchanged, bool doattach) line 2308    c# system.data.entity.core.objects.dataclasses.relatedend.addgraphtoobjectstatemanager(system.data.entity.core.objects.internal.ientitywrapper wrappedentity, bool relationshipalreadyexists, bool addrelationshipasunchanged, bool doattach) line 1588     c# system.data.entity.core.objects.dataclasses.relatedend.includeentity(system.data.entity.core.objects.internal.ientitywrapper wrappedentity, bool addrelationshipasunchanged, bool doattach) line 1823    c# system.data.entity.core.objects.dataclasses.entitycollection<trackedobject>.include(bool addrelationshipasunchanged, bool doattach) line 471 c# system.data.entity.core.objects.dataclasses.relatedend.walkobjectgraphtoincludeallrelatedentities(system.data.entity.core.objects.internal.ientitywrapper wrappedentity, bool addrelationshipasunchanged, bool doattach) line 2308    c# system.data.entity.core.objects.dataclasses.relatedend.addgraphtoobjectstatemanager(system.data.entity.core.objects.internal.ientitywrapper wrappedentity, bool relationshipalreadyexists, bool addrelationshipasunchanged, bool doattach) line 1588     c# system.data.entity.core.objects.dataclasses.relatedend.includeentity(system.data.entity.core.objects.internal.ientitywrapper wrappedentity, bool addrelationshipasunchanged, bool doattach) line 1823    c# system.data.entity.core.objects.dataclasses.entityreference<shippedupdate>.include(bool addrelationshipasunchanged, bool doattach) line 346 c# system.data.entity.core.objects.dataclasses.relationshipmanager.addrelatedentitiestoobjectstatemanager(bool doattach) line 1255        c# system.data.entity.core.objects.objectcontext.attachto(string entitysetname, object entity) line 1261               c# system.data.entity.internal.linq.internalset<trackedobject>.attach.anonymousmethod__9() line 339                c# system.data.entity.internal.linq.internalset<trackedobject>.actonset(system.action action, system.data.entity.entitystate newstate, object entity, string methodname) line 449    c# system.data.entity.internal.linq.internalset<trackedobject>.attach(object entity) line 338 c# system.data.entity.dbset<trackedobject>.attach(trackedobject entity) line 154 c# 

entityframework seems traversing huge number of nested relationships unnecessarily - i'm not sure why attaching single object cause such large amount of work? need add/delete row sql server table either update in-memory lists or cascade delete dependent objects.

is perhaps way relationships defined in our code-first classes? can put attribute on relationships "ignore when attaching"?

some code our classes: (snipped lot)

public class trackedobject {     [key]     [databasegenerated(databasegeneratedoption.identity)]     public int identity { get; set; }      public objectidentifier identifier { get; set; }      [required]     public int identifieridentity { get; set; }      [required]     public int shippedupdateidentity { get; set; }      [foreignkey("trackedobjectidentity")]     public virtual icollection<trackedobjectdependency> trackedobjectdependencies { get; set; }      public virtual shippedupdate shippedupdate { get; set; } }  public class objectidentifier : iequatable<objectidentifier> {             [key]     [databasegenerated(databasegeneratedoption.identity)]     public int identity { get; set; }      [foreignkey("identifieridentity")]     public virtual icollection<trackedobject> trackedobjects { get; set; }      [foreignkey("identifieridentity")]     public virtual icollection<trackedobjectdependency> trackedobjectdependencies { get; set; } }  public class shippedupdate {             [key]     [databasegenerated(databasegeneratedoption.identity)]     public int identity { get; set; }      [foreignkey("shippedupdateidentity")]     public virtual icollection<trackedobject> trackedobjects { get; set; } }  public class trackedobjectdependency {     [key]     [databasegenerated(databasegeneratedoption.identity)]     public int identity { get; set; }      public objectidentifier identifier { get; set; }      [required]     public int identifieridentity { get; set; }      [required]     public int trackedobjectidentity { get; set; }      public trackedobject trackedobject { get; set; } } 

the code delete items simple:

dbcontext.trackedobjects.attach(trackeditemtodelete); dbcontext.trackedobjects.remove(trackeditemtodelete); dbcontext.savechanges(); 

but causing stackoverflowexception. purely schema definition issue? or pointers appreciated.


Comments