class MyEntry { public EntityObject entity; // entity object, public string name; // EF public Dictionary<string, EntityKey> refmap; // foreign keys - - , // FK public Dictionary<string, EntityObject> objmap; // public Dictionary<EntityObject, string> keymap; // public MyEntry(string s, EntityObject o) { entity = o; name = s; refmap = new Dictionary<string, EntityKey>(); objmap = new Dictionary<string, EntityObject>(); keymap = new Dictionary<EntityObject, string>(); } }
// t derived class EntityContext var added = t.ObjectStateManager.GetObjectStateEntries(EntityState.Added);
List<MyEntry> allDataToProceed = new List<MyEntry>(); // foreach (var a in added) { // EF . // if (!(a.IsRelationship)) { // - "Foo", Foo a MyEntry e = new MyEntry(a.EntitySet.Name, a.Entity); allDataToProceed.Add(e); // foreign keys IEnumerable<IRelatedEnd> relEnds = ((IEntityWithRelationships)a.Entity).RelationshipManager.GetAllRelatedEnds(); foreach (var rel in relEnds) { // FKs List<EntityObject> fks = new List<EntityObject>(); foreach (var obj in rel) fks.Add((EntityObject)obj); // - var relname = rel.RelationshipName; if (fks.Count == 1) { // - , if (fks[0].EntityKey.EntityKeyValues != null) e.refmap[relname] = fks[0].EntityKey; else { // - , // . - // // FK e.keymap[fks[0]] = fks[0].EntityKey.EntitySetName; e.objmap[relname] = fks[0]; } } } } }
// foreach (var a1 in added) a1.Delete(); t.SaveChanges();
// FK // List<EntityObject> usedInRefs = new List<EntityObject>(); foreach (var a1 in allDataToProceed) { foreach (var dup in a1.objmap.Values) usedInRefs.Add(dup); } // for (int j = 0; j < allDataToProceed.Count; ++j) { if (usedInRefs.Contains(allDataToProceed[j].entity)) { allDataToProceed.RemoveAt(j); --j; } }
// - foreach (var a1 in allDataToProceed) { try { // FKs master/slave IEnumerable<IRelatedEnd> relEnds = ((IEntityWithRelationships)a1.entity).RelationshipManager.GetAllRelatedEnds(); foreach (var rel in relEnds) { var relname = rel.RelationshipName; EntityKey key = null; // EF // if (a1.refmap.ContainsKey(relname)) key = a1.refmap[relname]; EntityObject o = key != null ? o = (EntityObject)t.GetObjectByKey(key) : null; // - // master/slave if (o == null && a1.objmap.ContainsKey(relname)) { o = a1.objmap[relname]; if (a1.keymap.ContainsKey(o)) t.AddObject(a1.keymap[o], o); else o = null; } // - if (o != null) rel.Add(o); } // t.AddObject(a1.name, a1.entity); t.SaveChanges(); } catch (Exception e2) { // - // added = t.ObjectStateManager.GetObjectStateEntries(EntityState.Added); foreach (var a2 in added) a2.Delete(); // - , } }
Source: https://habr.com/ru/post/160897/
All Articles