internal EntityRecordInfo(DataRecordInfo info, EntityKey entityKey, EntitySet entitySet) : base(info) { _entityKey = entityKey; #if DEBUG try { ValidateEntityType(entitySet); } catch { Debug.Assert(false, "should always be valid EntityType when internally constructed"); throw; } #endif }
/// <summary> /// Reusing TypeUsage and FieldMetadata from another EntityRecordInfo which has all the same info /// but with a different EntityKey instance. /// </summary> internal EntityRecordInfo(DataRecordInfo info, EntityKey entityKey, EntitySet entitySet) : base(info) { _entityKey = entityKey; _entitySet = entitySet; #if DEBUG try { ValidateEntityType(entitySet); } catch { Debug.Assert(false, "should always be valid EntityType when internally constructed"); throw; } #endif }
internal StateManagerTypeMetadata(EdmType edmType, ObjectTypeMapping mapping) { Debug.Assert(null != edmType, "null EdmType"); Debug.Assert( Helper.IsEntityType(edmType) || Helper.IsComplexType(edmType), "not Complex or EntityType"); Debug.Assert( ReferenceEquals(mapping, null) || ReferenceEquals(mapping.EdmType, edmType), "different EdmType instance"); _typeUsage = TypeUsage.Create(edmType); _recordInfo = new DataRecordInfo(_typeUsage); var members = TypeHelpers.GetProperties(edmType); _members = new StateManagerMemberMetadata[members.Count]; _objectNameToOrdinal = new Dictionary<string, int>(members.Count); _cLayerNameToOrdinal = new Dictionary<string, int>(members.Count); ReadOnlyMetadataCollection<EdmMember> keyMembers = null; if (Helper.IsEntityType(edmType)) { keyMembers = ((EntityType)edmType).KeyMembers; } for (var i = 0; i < _members.Length; ++i) { var member = members[i]; ObjectPropertyMapping memberMap = null; if (null != mapping) { memberMap = mapping.GetPropertyMap(member.Name); if (null != memberMap) { _objectNameToOrdinal.Add(memberMap.ClrProperty.Name, i); // olayer name } } _cLayerNameToOrdinal.Add(member.Name, i); // clayer name // Determine whether this member is part of the identity of the entity. _members[i] = new StateManagerMemberMetadata(memberMap, member, ((null != keyMembers) && keyMembers.Contains(member))); } }
internal object CreateComplex(IExtendedDataRecord record, DataRecordInfo recordInfo, object result) { Debug.Assert(null != record, "null IExtendedDataRecord"); Debug.Assert(null != recordInfo, "null DataRecordInfo"); Debug.Assert(null != recordInfo.RecordType, "null TypeUsage"); Debug.Assert(null != recordInfo.RecordType.EdmType, "null EdmType"); Debug.Assert(Helper.IsEntityType(recordInfo.RecordType.EdmType) || Helper.IsComplexType(recordInfo.RecordType.EdmType), "not EntityType or ComplexType"); Plan plan = GetPlan(record, recordInfo); if (null == result) { result = ((Func<object>)plan.ClrType)(); } SetProperties(record, result, plan.Properties); return result; }
/// <summary> /// Reusing TypeUsage and FieldMetadata from another EntityRecordInfo which has all the same info /// but with a different EntityKey instance. /// </summary> internal DataRecordInfo(DataRecordInfo recordInfo) { _fieldMetadata = recordInfo._fieldMetadata; _metadata = recordInfo._metadata; }
private Plan GetPlan(IExtendedDataRecord record, DataRecordInfo recordInfo) { Debug.Assert(null != record, "null IExtendedDataRecord"); Debug.Assert(null != recordInfo, "null DataRecordInfo"); Debug.Assert(null != recordInfo.RecordType, "null TypeUsage"); Plan[] plans = _lastPlans ?? (_lastPlans = new Plan[MaxPlanCount]); // find an existing plan in circular buffer int index = _lastPlanIndex - 1; for (int i = 0; i < MaxPlanCount; ++i) { index = (index + 1) % MaxPlanCount; if (null == plans[index]) { break; } if (plans[index].Key == recordInfo.RecordType) { _lastPlanIndex = index; return plans[index]; } } Debug.Assert(0 <= index, "negative index"); Debug.Assert(index != _lastPlanIndex || (null == plans[index]), "index wrapped around"); // create a new plan ObjectTypeMapping mapping = System.Data.Common.Internal.Materialization.Util.GetObjectMapping(recordInfo.RecordType.EdmType, _workspace); Debug.Assert(null != mapping, "null ObjectTypeMapping"); Debug.Assert(Helper.IsComplexType(recordInfo.RecordType.EdmType), "IExtendedDataRecord is not ComplexType"); _lastPlanIndex = index; plans[index] = new Plan(recordInfo.RecordType, mapping, recordInfo.FieldMetadata); return plans[index]; }