private IList <EntityRecord> RunIncludeForEntityRef(IList <EntityRecord> records, EntityMemberInfo refMember) { if (records.Count == 0) { return(_emptyList); } var fkMember = refMember.ReferenceInfo.FromKey.ExpandedKeyMembers[0].Member; // r.Book_Id var fkValues = GetMemberValues(records, fkMember); var cmd = refMember.ReferenceInfo.ToKey.SelectByKeyArrayCommand; var newRecs = _session.ExecuteSelect(cmd, fkValues); if (newRecs.Count == 0) { return(_emptyList); } // Set ref members in parent records var targetPk = refMember.ReferenceInfo.ToKey; foreach (var parentRec in records) { var fkValue = parentRec.GetValueDirect(fkMember); if (fkValue == DBNull.Value) { parentRec.SetValueDirect(refMember, DBNull.Value); } else { var pkKey = new EntityKey(targetPk, fkValue); //we lookup in session, instead of searching in results of Include query - all just loaded records are registered in session and lookup is done by key (it is fact dict lookup) var targetRec = _session.GetRecord(pkKey); parentRec.SetValueDirect(refMember, targetRec); } } return(newRecs); }
public static EntityRecord CloneAndAttach(EntitySession toSession, EntityRecord record, bool forceFullCopy = false) { if (record.Session == toSession) { return(record); //do not clone if it is already in this session } //If record with the same PK is already loaded in session, use it in result; otherwise, clone record from cache and attach var sessionRec = toSession.GetRecord(record.PrimaryKey, LoadFlags.None); if (sessionRec == null) { sessionRec = new EntityRecord(record); //make clone toSession.Attach(sessionRec); } else if (sessionRec.Status == EntityStatus.Stub || forceFullCopy) { sessionRec.CopyOriginalValues(record); } sessionRec.SourceCacheType = CacheType.FullSet; return(sessionRec); }