Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }