Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Objects / Internal / PocoPropertyAccessorStrategy.cs / 1305376 / PocoPropertyAccessorStrategy.cs
using System; using System.Collections.Generic; using System.Text; using System.Data.Objects.DataClasses; using System.Diagnostics; using System.Reflection; using System.Data.Metadata.Edm; using System.Linq.Expressions; using System.Data.Common.Utils; using System.Data.Mapping; namespace System.Data.Objects.Internal { ////// Implementation of the property accessor strategy that gets and sets values on POCO entities. That is, /// entities that do not implement IEntityWithRelationships. /// internal sealed class PocoPropertyAccessorStrategy : IPropertyAccessorStrategy { private static readonly MethodInfo s_AddToCollectionGeneric = typeof(PocoPropertyAccessorStrategy).GetMethod("AddToCollection", BindingFlags.NonPublic | BindingFlags.Static); private static readonly MethodInfo s_RemoveFromCollectionGeneric = typeof(PocoPropertyAccessorStrategy).GetMethod("RemoveFromCollection", BindingFlags.NonPublic | BindingFlags.Static); private object _entity; ////// Constructs a strategy object to work with the given entity. /// /// The entity to use public PocoPropertyAccessorStrategy(object entity) { _entity = entity; } #region Navigation Property Accessors #region GetNavigationPropertyValue // See IPropertyAccessorStrategy public object GetNavigationPropertyValue(RelatedEnd relatedEnd) { object navPropValue = null; if (relatedEnd != null) { if (relatedEnd.TargetAccessor.ValueGetter == null) { Type type = GetDeclaringType(relatedEnd); PropertyInfo propertyInfo = EntityUtil.GetTopProperty(ref type, relatedEnd.TargetAccessor.PropertyName); if (propertyInfo == null) { throw new EntityException(System.Data.Entity.Strings.PocoEntityWrapper_UnableToSetFieldOrProperty(relatedEnd.TargetAccessor.PropertyName, type.FullName)); } EntityProxyFactory factory = new EntityProxyFactory(); relatedEnd.TargetAccessor.ValueGetter = factory.CreateBaseGetter(type, propertyInfo); } try { navPropValue = relatedEnd.TargetAccessor.ValueGetter(_entity); } catch (Exception ex) { throw new EntityException(System.Data.Entity.Strings.PocoEntityWrapper_UnableToSetFieldOrProperty(relatedEnd.TargetAccessor.PropertyName, _entity.GetType().FullName), ex); } } return navPropValue; } #endregion #region SetNavigationPropertyValue // See IPropertyAccessorStrategy public void SetNavigationPropertyValue(RelatedEnd relatedEnd, object value) { if (relatedEnd != null) { if (relatedEnd.TargetAccessor.ValueSetter == null) { Type type = GetDeclaringType(relatedEnd); PropertyInfo propertyInfo = EntityUtil.GetTopProperty(ref type, relatedEnd.TargetAccessor.PropertyName); if (propertyInfo == null) { throw new EntityException(System.Data.Entity.Strings.PocoEntityWrapper_UnableToSetFieldOrProperty(relatedEnd.TargetAccessor.PropertyName, type.FullName)); } EntityProxyFactory factory = new EntityProxyFactory(); relatedEnd.TargetAccessor.ValueSetter = factory.CreateBaseSetter(type, propertyInfo); } try { relatedEnd.TargetAccessor.ValueSetter(_entity, value); } catch (Exception ex) { throw new EntityException(System.Data.Entity.Strings.PocoEntityWrapper_UnableToSetFieldOrProperty(relatedEnd.TargetAccessor.PropertyName, _entity.GetType().FullName), ex); } } } private static Type GetDeclaringType(RelatedEnd relatedEnd) { if (relatedEnd.NavigationProperty != null) { EntityType declaringEntityType = (EntityType)relatedEnd.NavigationProperty.DeclaringType; ObjectTypeMapping mapping = System.Data.Common.Internal.Materialization.Util.GetObjectMapping(declaringEntityType, relatedEnd.WrappedOwner.Context.MetadataWorkspace); return mapping.ClrType.ClrType; } else { return relatedEnd.WrappedOwner.IdentityType; } } private static Type GetNavigationPropertyType(Type entityType, string propertyName) { Type navPropType; PropertyInfo property = EntityUtil.GetTopProperty(entityType, propertyName); if (property != null) { navPropType = property.PropertyType; } else { FieldInfo field = entityType.GetField(propertyName); if (field != null) { navPropType = field.FieldType; } else { throw new EntityException(System.Data.Entity.Strings.PocoEntityWrapper_UnableToSetFieldOrProperty(propertyName, entityType.FullName)); } } return navPropType; } #endregion #endregion #region Collection Navigation Property Accessors #region CollectionAdd // See IPropertyAccessorStrategy public void CollectionAdd(RelatedEnd relatedEnd, object value) { object entity = _entity; try { object collection = GetNavigationPropertyValue(relatedEnd); if (collection == null) { collection = CollectionCreate(relatedEnd); SetNavigationPropertyValue(relatedEnd, collection); } Debug.Assert(collection != null, "Collection is null"); // do not call Add if the collection is a RelatedEnd instance if (collection == relatedEnd) { return; } if (relatedEnd.TargetAccessor.CollectionAdd == null) { relatedEnd.TargetAccessor.CollectionAdd = CreateCollectionAddFunction(entity.GetType(), relatedEnd.TargetAccessor.PropertyName); } relatedEnd.TargetAccessor.CollectionAdd(collection, value); } catch (Exception ex) { throw new EntityException(System.Data.Entity.Strings.PocoEntityWrapper_UnableToSetFieldOrProperty(relatedEnd.TargetAccessor.PropertyName, entity.GetType().FullName), ex); } } // Helper method to create delegate with property setter private static Action
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- RSAOAEPKeyExchangeFormatter.cs
- DoubleAnimationUsingKeyFrames.cs
- MaskDesignerDialog.cs
- XPathItem.cs
- MultiTargetingUtil.cs
- AxHost.cs
- MdImport.cs
- DefaultMemberAttribute.cs
- FixedLineResult.cs
- DesignerSerializationVisibilityAttribute.cs
- CustomAttribute.cs
- MemberInfoSerializationHolder.cs
- CodeMethodReturnStatement.cs
- RealProxy.cs
- CacheSection.cs
- ScaleTransform.cs
- IdnElement.cs
- RequestTimeoutManager.cs
- MediaPlayer.cs
- DataGridRow.cs
- RelationshipManager.cs
- KernelTypeValidation.cs
- Triangle.cs
- XamlPathDataSerializer.cs
- MethodBuilderInstantiation.cs
- HostExecutionContextManager.cs
- MenuAdapter.cs
- DetailsView.cs
- Adorner.cs
- CodeObject.cs
- DynamicILGenerator.cs
- SystemWebCachingSectionGroup.cs
- MetadataResolver.cs
- SettingsPropertyWrongTypeException.cs
- EncoderNLS.cs
- AQNBuilder.cs
- EventLogger.cs
- XamlGridLengthSerializer.cs
- ToolStripProgressBar.cs
- SqlUdtInfo.cs
- FormatterServices.cs
- BindingOperations.cs
- HyperLinkDataBindingHandler.cs
- TextChangedEventArgs.cs
- unsafeIndexingFilterStream.cs
- QueryCursorEventArgs.cs
- PersistenceContext.cs
- DataControlFieldHeaderCell.cs
- MethodBody.cs
- StyleCollection.cs
- OdbcInfoMessageEvent.cs
- sqlmetadatafactory.cs
- ScriptIgnoreAttribute.cs
- SafeHandles.cs
- TextElementEditingBehaviorAttribute.cs
- WebResponse.cs
- MenuItemStyleCollection.cs
- DesignerDataRelationship.cs
- EntitySqlException.cs
- Queue.cs
- FrameworkContentElement.cs
- FrameworkPropertyMetadata.cs
- ExtensionFile.cs
- XmlSchemaImport.cs
- XmlQueryOutput.cs
- CompositeScriptReference.cs
- DataGridRowClipboardEventArgs.cs
- RowToParametersTransformer.cs
- ReadOnlyDataSource.cs
- ListViewSelectEventArgs.cs
- WsdlBuildProvider.cs
- Marshal.cs
- CompilerScopeManager.cs
- AttributeCollection.cs
- SynchronizedKeyedCollection.cs
- ResourceWriter.cs
- InstanceDescriptor.cs
- Trigger.cs
- DataViewManagerListItemTypeDescriptor.cs
- OdbcCommandBuilder.cs
- PixelFormat.cs
- TdsParameterSetter.cs
- ForwardPositionQuery.cs
- AssociationSetEnd.cs
- TableItemPattern.cs
- ObjectRef.cs
- Scanner.cs
- ParseNumbers.cs
- XmlUtf8RawTextWriter.cs
- TransformPattern.cs
- WindowAutomationPeer.cs
- DataGridItem.cs
- Attributes.cs
- DocumentSequence.cs
- TdsRecordBufferSetter.cs
- HttpAsyncResult.cs
- ActivityCodeDomSerializationManager.cs
- Transform3DGroup.cs
- XmlReader.cs
- TaskHelper.cs