1 //---------------------------------------------------------------------
2 // <copyright file="EntityDataSource.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
8 //---------------------------------------------------------------------
10 using System.Collections;
12 using System.Data.Common;
13 using System.Data.Objects;
14 using System.Data.Metadata.Edm;
15 using System.Configuration;
16 using System.Diagnostics;
18 using System.Reflection;
20 using System.Web.Security;
22 using System.Web.UI.WebControls;
23 using System.Web.DynamicData;
24 using System.Data.Objects.DataClasses;
25 using System.Collections.Specialized;
26 using System.ComponentModel;
27 using System.Collections.Generic;
28 using System.Windows.Forms;
29 using System.Security.Permissions;
32 using System.Globalization;
33 using System.Web.Configuration;
35 [assembly:TagPrefix("System.Web.UI.WebControls", "asp")]
36 namespace System.Web.UI.WebControls
39 DefaultEvent("Selecting"),
40 DefaultProperty("EntitySetName"),
41 Designer("System.Web.UI.Design.WebControls.EntityDataSourceDesigner, " + AssemblyRef.SystemWebEntityDesign),
43 PersistChildren(false),
44 ResourceDescription(WebControlsRes.EntityDataSource_Description),
45 ResourceDisplayName(WebControlsRes.EntityDataSource_DisplayName),
46 ToolboxBitmap(typeof(EntityDataSource), "EntityDataSource.ico"),
48 public class EntityDataSource : DataSourceControl, System.Web.DynamicData.IDynamicDataSource, IQueryableDataSource
52 private const int ORD_CONTROLSTATE = 0;
53 private const int ORD_VIEW = 1;
54 private const int ORD_WHERE_PARAMS = 2;
55 private const int ORD_COMMAND_PARAMS = 3;
56 private const int ORD_ORDERBY_PARAMS = 4;
57 private const int ORD_DELETE_PARAMS = 5;
58 private const int ORD_INSERT_PARAMS = 6;
59 private const int ORD_UPDATE_PARAMS = 7;
60 private const int ORD_SELECT_PARAMS = 8;
64 #region Private Fields
66 private string _contextTypeName;
67 private string _entitySetName;
68 private string _defaultContainerName;
69 private string _where;
70 private string _orderBy;
71 private string _select;
72 private string _commandText;
73 private string _groupBy;
74 private string _include;
75 private string _entityTypeFilter;
76 private string _connectionString;
78 private ParameterCollection _commandParameters = null;
79 private ParameterCollection _whereParameters = null;
80 private ParameterCollection _orderByParameters = null;
81 private ParameterCollection _deleteParameters = null;
82 private ParameterCollection _updateParameters = null;
83 private ParameterCollection _insertParameters = null;
84 private ParameterCollection _selectParameters = null;
86 private string _viewName = "EntityDataSourceView";
87 private EntityDataSourceView _view = null;
89 private bool _enableUpdate = false;
90 private bool _enableDelete = false;
91 private bool _enableInsert = false;
92 private bool _autoSort = true;
93 private bool _autoPage = true;
94 private bool _autoGenerateWhereClause = false;
95 private bool _autoGenerateOrderByClause = false;
96 private bool _enableFlattening = true;
97 private bool _storeOriginalValuesInViewState = true;
98 private Type _contextType = null;
100 private readonly System.Data.EntityClient.EntityConnection _connection;
101 private readonly Version _targetFrameworkVersion;
104 #region Public Surface
107 public EntityDataSource()
109 _targetFrameworkVersion = HttpRuntime.TargetFramework;
112 public EntityDataSource(System.Data.EntityClient.EntityConnection connection)
115 _connection = connection;
119 #region Public Properties
122 /// Indicates whether the EntityDataSource is to automatically
123 /// generate an OrderBy expression using property name(s) and value(s) from
124 /// the OrderByParameters.
128 Category("Behavior"),
129 ResourceDescription(WebControlsRes.PropertyDescription_AutoGenerateOrderByClause)
131 public bool AutoGenerateOrderByClause
133 get { return _autoGenerateOrderByClause; }
136 _autoGenerateOrderByClause = value;
137 View.RaiseChangedEvent();
143 /// Indicates whether the EntityDataSource is to automatically
144 /// generate a Where expression using property name(s) and value(s) from
145 /// the WhereParameters.
149 Category("Behavior"),
150 ResourceDescription(WebControlsRes.PropertyDescription_AutoGenerateWhereClause)
152 public bool AutoGenerateWhereClause
154 get { return _autoGenerateWhereClause; }
157 _autoGenerateWhereClause = value;
158 View.RaiseChangedEvent();
163 /// Indicates to the EntityDataSource that the user wishes to perform paging.
167 Category("Behavior"),
168 ResourceDescription(WebControlsRes.PropertyDescription_AutoPage)
172 get { return _autoPage; }
176 View.RaiseChangedEvent();
181 /// Indicates to the EntityDataSource that the user wishes to perform sorting.
185 Category("Behavior"),
186 ResourceDescription(WebControlsRes.PropertyDescription_AutoSort)
190 get { return _autoSort; }
194 View.RaiseChangedEvent();
199 /// The name of the container. Required if DefaultConainerName is not set on the ObjectContext.
201 // devnote: Design-time attributes are not used here because this property is overridden by one in the designer
202 public string DefaultContainerName
204 get { return _defaultContainerName; }
207 _defaultContainerName = value;
208 View.RaiseChangedEvent();
212 internal System.Data.EntityClient.EntityConnection Connection
214 get { return _connection; }
218 /// ConnectionString is required if DefaultContainerName is defined and neither
219 /// ContextType nor ContextTypeName are defined.
221 public String ConnectionString
223 get { return _connectionString; }
226 _connectionString = value;
227 View.RaiseChangedEvent();
233 // devnote: Design-time attributes are not used here because this property is not visible in the designer (it is filtered out with PreFilterProperties)
235 /// Defined by the IDynamicDataSource interface.
236 /// Provides a type to be used as the ObjectContext through which the EntityDataSource will
237 /// provide operations to the EntityFramework
239 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
240 public Type ContextType
242 get { return _contextType; }
245 _contextType = value;
248 _contextTypeName = value.FullName;
252 _contextTypeName = null;
254 View.RaiseChangedEvent();
260 /// The fully-qualified type name for the ObjectContext through which the EntityDataSource will
261 /// provide operations to the EntityFramework
266 ResourceDescription(WebControlsRes.PropertyDescription_ContextTypeName)
268 public string ContextTypeName
270 get { return _contextTypeName; }
273 _contextTypeName = value;
275 if (!String.IsNullOrEmpty(value) && System.Web.Hosting.HostingEnvironment.IsHosted)
277 _contextType = System.Web.Compilation.BuildManager.GetType(value, /*throwOnError*/false, /*ignoreCase*/true);
283 View.RaiseChangedEvent();
288 /// Indicates to the EntityDataSource that the user wishes entities to be flattened or not.
292 Category("Behavior"),
293 ResourceDescription(WebControlsRes.PropertyDescription_EnableFlattening)
295 public bool EnableFlattening
297 get { return _enableFlattening; }
300 _enableFlattening = value;
301 View.RaiseChangedEvent();
306 /// Provides default values for entities that are to be deleted.
307 /// Sets the named properties to the provided values only if the properties are null
308 /// (not otherwise defined).
312 MergableProperty(false),
313 PersistenceMode(PersistenceMode.InnerProperty),
316 public ParameterCollection DeleteParameters
320 if (null == _deleteParameters)
322 _deleteParameters = new ParameterCollection();
323 if (UseNetFramework4Behavior)
325 _deleteParameters.ParametersChanged += new EventHandler(this.OnParametersChanged);
328 return _deleteParameters;
333 /// Indicates to the EntityDataSource that the user wishes to perform delete operations.
337 Category("Behavior"),
338 ResourceDescription(WebControlsRes.PropertyDescription_EnableDelete)
340 public bool EnableDelete
342 get { return _enableDelete; }
345 _enableDelete = value;
346 View.RaiseChangedEvent();
351 /// Indicates to the EntityDatSource that the user wishes to perform insert operations.
355 Category("Behavior"),
356 ResourceDescription(WebControlsRes.PropertyDescription_EnableInsert)
358 public bool EnableInsert
360 get { return _enableInsert; }
363 _enableInsert = value;
364 View.RaiseChangedEvent();
369 /// Indicates to the EntityDataSource that the user wishes to perform update operations
373 Category("Behavior"),
374 ResourceDescription(WebControlsRes.PropertyDescription_EnableUpdate)
376 public bool EnableUpdate
378 get { return _enableUpdate; }
381 _enableUpdate = value;
382 View.RaiseChangedEvent();
388 /// The name of the EntitySet used by this instance of the EntityDataSource control.
389 /// For editable scenarios, the EntitySetName is used as the EntitySql query expression.
390 /// All insert, update and delete operations are restricted to a single EntitySet.
392 // devnote: Design-time attributes are not used here because this property is overridden by one in the designer
393 public string EntitySetName
395 get { return _entitySetName; }
398 _entitySetName = value;
399 View.RaiseChangedEvent();
404 /// An arbitrary EntitySql CommandText for performing the query.
405 /// A query specified with CommandText is not editable.
407 // devnote: Design-time attributes are not used here because this property is overridden by one in the designer
408 public string CommandText
410 get { return _commandText; }
413 _commandText = value;
414 View.RaiseChangedEvent();
419 /// Named parameters to be used with the CommandText.
420 /// Corresponds to the ObjectParameters used in the ObjectQuery<T> query.
421 /// Null values are passed into the ObjectParameter collection as the Type of the Parameter.
425 MergableProperty(false),
426 PersistenceMode(PersistenceMode.InnerProperty),
429 public ParameterCollection CommandParameters
433 if (null == _commandParameters)
435 _commandParameters = new ParameterCollection();
436 _commandParameters.ParametersChanged += new EventHandler(this.OnParametersChanged);
438 return _commandParameters;
442 internal string FQEntitySetName
446 if (!String.IsNullOrEmpty(DefaultContainerName))
448 return DefaultContainerName + "." + EntitySetName;
450 return EntitySetName;
455 /// The expression provided to the GroupBy ObjectQuery<T> builder method.
456 /// GroupBy expression requires Select to be defined.
457 /// These projections are not editable.
462 ResourceDescription(WebControlsRes.PropertyDescription_GroupBy),
464 public string GroupBy
466 get { return _groupBy; }
470 View.RaiseChangedEvent();
475 /// An expression approxaimately corresponding to the Include method on the ObjectQuery<T>.
476 /// Gets or sets an expression describing which navigations should be included in the query.
477 /// To describe a chain of navigations, use dots (e.g. "Orders.OrderDetails"). To include multiple
478 /// paths, use commas (e.g. "Orders.OrderDetails, Supplies").
483 ResourceDescription(WebControlsRes.PropertyDescription_Include)
485 public string Include
494 View.RaiseChangedEvent();
500 /// Provides default values for inserted entities.
501 /// Properties that are null (not otherwise defined) are set to the value specified
502 /// by InsertParameters.
506 MergableProperty(false),
507 PersistenceMode(PersistenceMode.InnerProperty),
510 public ParameterCollection InsertParameters
514 if (null == _insertParameters)
516 _insertParameters = new ParameterCollection();
517 if (UseNetFramework4Behavior)
519 _insertParameters.ParametersChanged += new EventHandler(this.OnParametersChanged);
522 return _insertParameters;
526 // devnote: Design-time attributes are not used here because this property is overridden by one in the designer
529 /// Provides a sort expression corresonding to the OrderBy method on the ObjectQuery<T>
531 public string OrderBy
533 get { return _orderBy; }
537 View.RaiseChangedEvent();
542 /// Each Parameter is mapped to as named ObjectParameter in the ObjectQuery<T>
543 /// If a null value is set on the Parameter, then the Type is passed in as the
548 MergableProperty(false),
549 PersistenceMode(PersistenceMode.InnerProperty),
552 public ParameterCollection OrderByParameters
556 if (null == _orderByParameters)
558 _orderByParameters = new ParameterCollection();
559 _orderByParameters.ParametersChanged += new EventHandler(this.OnParametersChanged);
561 return _orderByParameters;
565 // devnote: Design-time attributes are not used here because this property is overridden by one in the designer
567 /// Forces the EntityDatSource to return entities of only a single derived type.
568 /// If the EntitySet provided as the query expression is polymorphic, then EntityTypeFilter
569 /// is required if the collection is to be editable.
571 public string EntityTypeFilter
573 get { return _entityTypeFilter; }
576 _entityTypeFilter = value;
577 View.RaiseChangedEvent();
582 /// Text for the Select query builder method.
583 /// Projections are not editable in the EntityDataSource control.
585 // devnote: Design-time attributes are not used here because this property is overridden by one in the designer
588 get { return _select; }
592 View.RaiseChangedEvent();
596 /// Each Parameter is mapped to an ObjectParameter in the ObjectQuery<T>
597 /// If a null value is set on the Parameter, then the Type is passed in as the
598 /// named ObjectParameter.
602 MergableProperty(false),
603 PersistenceMode(PersistenceMode.InnerProperty),
606 public ParameterCollection SelectParameters
610 if (null == _selectParameters)
612 _selectParameters = new ParameterCollection();
613 _selectParameters.ParametersChanged += new EventHandler(this.OnParametersChanged);
615 return _selectParameters;
620 /// Setting this value to false disables storing original values in ViewState.
621 /// Setting this value to false implies that the user understands the concurrency model in the
622 /// EntityFramework and the update behavior of the EntityDataSource. Its use should be
623 /// reserved for expert users only.
627 Category("Behavior"),
628 ResourceDescription(WebControlsRes.PropertyDescription_StoreOriginalValuesInViewState)
630 public bool StoreOriginalValuesInViewState
632 get { return _storeOriginalValuesInViewState; }
635 _storeOriginalValuesInViewState = value;
636 View.RaiseChangedEvent();
641 /// Provides default values to be used during updates. The values provided by UpdateParameters
642 /// are used for properties on the entity when the properties are null
646 MergableProperty(false),
647 PersistenceMode(PersistenceMode.InnerProperty),
650 public ParameterCollection UpdateParameters
654 if (null == _updateParameters)
656 _updateParameters = new ParameterCollection();
657 if (UseNetFramework4Behavior)
659 _updateParameters.ParametersChanged += new EventHandler(this.OnParametersChanged);
662 return _updateParameters;
667 /// The text provided to the Where method on the ObjectQuery<T>
669 // devnote: Design-time attributes are not used here because this property is overridden by one in the designer
672 get { return _where; }
676 View.RaiseChangedEvent();
681 /// Each Parameter is mapped to an ObjectParameter in the ObjectQuery<T>
682 /// If a null value is set on the Parameter, then the Type is passed in as the
683 /// named ObjectParameter.
687 MergableProperty(false),
688 PersistenceMode(PersistenceMode.InnerProperty),
691 public ParameterCollection WhereParameters
695 if (null == _whereParameters)
697 _whereParameters = new ParameterCollection();
698 _whereParameters.ParametersChanged += new EventHandler(this.OnParametersChanged);
700 return _whereParameters;
708 #region Property Getters
710 private ObjectParameter[] CreateObjectParametersFromParameterCollection(ParameterCollection paramColl)
712 IOrderedDictionary paramValues = paramColl.GetValues(HttpContext, this);
714 List<ObjectParameter> objectParameters = new List<ObjectParameter>();
715 foreach (Parameter parameter in paramColl)
717 if (!string.IsNullOrEmpty(parameter.Name))
719 WebControlParameterProxy wcParam = new WebControlParameterProxy(parameter, paramColl, this);
721 if (wcParam.Value != null)
723 objectParameters.Add(new ObjectParameter(wcParam.Name, wcParam.Value));
727 objectParameters.Add(new ObjectParameter(wcParam.Name, wcParam.ClrType));
731 return objectParameters.ToArray();
735 internal ObjectParameter[] GetOrderByParameters()
737 return CreateObjectParametersFromParameterCollection(OrderByParameters);
740 internal ObjectParameter[] GetWhereParameters()
742 return CreateObjectParametersFromParameterCollection(WhereParameters);
745 // CommandParameters may be set in selectArgs
746 internal ObjectParameter[] GetCommandParameters()
748 return CreateObjectParametersFromParameterCollection(CommandParameters);
751 internal ObjectParameter[] GetSelectParameters()
753 return CreateObjectParametersFromParameterCollection(SelectParameters);
758 #region DataSourceControl overrides
759 protected override DataSourceView GetView(string viewName)
763 protected override ICollection GetViewNames()
765 return new string[] { this._viewName };
770 #region Private Properties
771 private EntityDataSourceView View
777 _view = CreateView();
778 if (IsTrackingViewState)
780 ((IStateManager)_view).TrackViewState();
788 /// Users can override this method to control the creation of the data source view.
790 /// <returns>An instance of EntityDataSourceView</returns>
791 protected virtual EntityDataSourceView CreateView()
793 return new EntityDataSourceView(this, _viewName);
796 internal HttpContext HttpContext
804 private bool UseNetFramework4Behavior
808 return _targetFrameworkVersion == new Version(4, 0);
812 #endregion Private Properties
814 #region IStateManager overrides
816 protected override object SaveControlState()
818 // Order is sensitive, referenced by LoadControlState.
819 var state = new object[9];
820 state[ORD_CONTROLSTATE] = base.SaveControlState();
821 state[ORD_VIEW] = _view == null ? null : ((IStateManager)_view).SaveViewState();
822 state[ORD_WHERE_PARAMS] = SaveParametersViewState(_whereParameters);
823 state[ORD_COMMAND_PARAMS] = SaveParametersViewState(_commandParameters);
824 state[ORD_ORDERBY_PARAMS] = SaveParametersViewState(_orderByParameters);
826 if (UseNetFramework4Behavior)
828 state[ORD_DELETE_PARAMS] = SaveParametersViewState(_deleteParameters);
829 state[ORD_INSERT_PARAMS] = SaveParametersViewState(_insertParameters);
830 state[ORD_UPDATE_PARAMS] = SaveParametersViewState(_updateParameters);
833 state[ORD_SELECT_PARAMS] = SaveParametersViewState(_selectParameters);
837 private object SaveParametersViewState(ParameterCollection parameters)
839 if (parameters != null)
841 return ((IStateManager)parameters).SaveViewState();
846 protected override void LoadControlState(object savedState)
848 if (null == savedState)
850 base.LoadControlState(null);
852 else // (savedState != null)
854 // Order is sensitive, referenced by SaveControlState.
855 var state = (object[])savedState;
856 if (state[ORD_CONTROLSTATE] != null)
858 base.LoadControlState(state[ORD_CONTROLSTATE]);
860 if (state[ORD_VIEW] != null)
862 ((IStateManager)View).LoadViewState(state[ORD_VIEW]);
864 if (state[ORD_WHERE_PARAMS] != null)
866 ((IStateManager)WhereParameters).LoadViewState(state[ORD_WHERE_PARAMS]);
868 if (state[ORD_COMMAND_PARAMS] != null)
870 ((IStateManager)CommandParameters).LoadViewState(state[ORD_COMMAND_PARAMS]);
872 if (state[ORD_ORDERBY_PARAMS] != null)
874 ((IStateManager)OrderByParameters).LoadViewState(state[ORD_ORDERBY_PARAMS]);
876 if (UseNetFramework4Behavior)
878 if (state[ORD_DELETE_PARAMS] != null)
880 ((IStateManager)DeleteParameters).LoadViewState(state[ORD_DELETE_PARAMS]);
882 if (state[ORD_INSERT_PARAMS] != null)
884 ((IStateManager)InsertParameters).LoadViewState(state[ORD_INSERT_PARAMS]);
886 if (state[ORD_UPDATE_PARAMS] != null)
888 ((IStateManager)UpdateParameters).LoadViewState(state[ORD_UPDATE_PARAMS]);
891 if (state[ORD_SELECT_PARAMS] != null)
893 ((IStateManager)SelectParameters).LoadViewState(state[ORD_SELECT_PARAMS]);
898 protected override void TrackViewState()
900 base.TrackViewState();
901 ((IStateManager)View).TrackViewState();
902 ((IStateManager)WhereParameters).TrackViewState();
903 ((IStateManager)CommandParameters).TrackViewState();
904 ((IStateManager)OrderByParameters).TrackViewState();
905 if (UseNetFramework4Behavior)
907 ((IStateManager)DeleteParameters).TrackViewState();
908 ((IStateManager)InsertParameters).TrackViewState();
909 ((IStateManager)UpdateParameters).TrackViewState();
911 ((IStateManager)SelectParameters).TrackViewState();
917 event EventHandler<DynamicValidatorEventArgs> IDynamicDataSource.Exception
919 add { View.Exception += value; }
920 remove { View.Exception -= value; }
924 /// An event that is fired just prior to the creation of the ObjectContext.
925 /// The user can provide their own context here.
929 ResourceDescription(WebControlsRes.PropertyDescription_ContextCreating)
931 public event EventHandler<EntityDataSourceContextCreatingEventArgs> ContextCreating
933 add { View.ContextCreating += value; }
934 remove { View.ContextCreating -= value; }
938 /// An event that is fired just following the creation of the ObjectContext to provide
939 /// the user with a reference to the created context.
943 ResourceDescription(WebControlsRes.PropertyDescription_ContextCreated)
945 public event EventHandler<EntityDataSourceContextCreatedEventArgs> ContextCreated
947 add { View.ContextCreated += value; }
948 remove { View.ContextCreated -= value; }
952 /// An event fired just prior to the ObjectContext being disposed.
953 /// It is cancellable in case the user needs to hold onto a reference to the Context.
957 ResourceDescription(WebControlsRes.PropertyDescription_ContextDisposing)
959 public event EventHandler<EntityDataSourceContextDisposingEventArgs> ContextDisposing
961 add { View.ContextDisposing += value; }
962 remove { View.ContextDisposing -= value; }
966 /// An event fired prior to the execution of the query in the ExecuteSelect method.
967 /// The user can modify the properties of the
968 /// EntityDataSource to modify its behavior.
969 /// The user can cancel the execution of the query in this event.
973 ResourceDescription(WebControlsRes.PropertyDescription_Selecting)
975 public event EventHandler<EntityDataSourceSelectingEventArgs> Selecting
977 add { View.Selecting += value; }
978 remove { View.Selecting -= value; }
982 /// An event that is fired after the query has been executed in the ExecuteSelect method.
983 /// The event provides the collection of returned entities for inspection or modification prior to display.
987 ResourceDescription(WebControlsRes.PropertyDescription_Selected)
989 public event EventHandler<EntityDataSourceSelectedEventArgs> Selected
991 add { View.Selected += value; }
992 remove { View.Selected -= value; }
996 /// An event fired just prior to deleting an object from the database.
997 /// The object is provided so the user can inspect or modify it.
998 /// The user can cancel the deletion.
1002 ResourceDescription(WebControlsRes.PropertyDescription_Deleting)
1004 public event EventHandler<EntityDataSourceChangingEventArgs> Deleting
1006 add { View.Deleting += value; }
1007 remove { View.Deleting -= value; }
1011 /// An event fired just after the entity has been deleted from the database.
1015 ResourceDescription(WebControlsRes.PropertyDescription_Deleted)
1017 public event EventHandler<EntityDataSourceChangedEventArgs> Deleted
1019 add { View.Deleted += value; }
1020 remove { View.Deleted -= value; }
1024 /// An event fired just prior to the insertion of an entity into the database.
1025 /// The user is provided with the entity for modification prior to insertion.
1026 /// The insertion is cancellable.
1030 ResourceDescription(WebControlsRes.PropertyDescription_Inserting)
1032 public event EventHandler<EntityDataSourceChangingEventArgs> Inserting
1034 add { View.Inserting += value; }
1035 remove { View.Inserting -= value; }
1039 /// An event fired just after the entity has been inserted into the database.
1043 ResourceDescription(WebControlsRes.PropertyDescription_Inserted)
1045 public event EventHandler<EntityDataSourceChangedEventArgs> Inserted
1047 add { View.Inserted += value; }
1048 remove { View.Inserted -= value; }
1052 /// An event fired just after a modified entity has been updated in the database.
1056 ResourceDescription(WebControlsRes.PropertyDescription_Updated)
1058 public event EventHandler<EntityDataSourceChangedEventArgs> Updated
1060 add { View.Updated += value; }
1061 remove { View.Updated -= value; }
1065 /// An event fired just prior to saving a modified entity to the database.
1066 /// The entity is provided to the event for modification.
1067 /// The update is cancellable.
1071 ResourceDescription(WebControlsRes.PropertyDescription_Updating)
1073 public event EventHandler<EntityDataSourceChangingEventArgs> Updating
1075 add { View.Updating += value; }
1076 remove { View.Updating -= value; }
1079 #region IQueryableDataSource Members
1083 ResourceDescription(WebControlsRes.PropertyDescription_QueryCreated)
1085 public event EventHandler<QueryCreatedEventArgs> QueryCreated
1087 add { View.QueryCreated += value; }
1088 remove { View.QueryCreated -= value; }
1091 void IQueryableDataSource.RaiseViewChanged()
1093 View.RaiseChangedEvent();
1098 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2109:ReviewVisibleEventHandlers", MessageId = "0#")]
1099 protected override void OnInit(EventArgs e)
1102 Debug.Assert(Page != null);
1103 Page.LoadComplete += new EventHandler(this.OnPageLoadComplete);
1104 if (StoreOriginalValuesInViewState && (View.CanDelete || View.CanUpdate))
1106 Page.RegisterRequiresViewStateEncryption();
1108 Page.RegisterRequiresControlState(this);
1111 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2109:ReviewVisibleEventHandlers", MessageId = "0#")]
1112 protected override void OnUnload(EventArgs e)
1115 if (null != _view) //Don't want to call View and create a new view during unload.
1117 _view.DisposeContext();
1121 private void OnPageLoadComplete(object sender, EventArgs e)
1123 CommandParameters.UpdateValues(HttpContext, this);
1124 WhereParameters.UpdateValues(HttpContext, this);
1125 OrderByParameters.UpdateValues(HttpContext, this);
1126 SelectParameters.UpdateValues(HttpContext, this);
1129 private void OnParametersChanged(object sender, EventArgs e)
1131 View.RaiseChangedEvent();
1135 #region Error Checking
1136 internal bool ValidateUpdatableConditions()
1138 bool anyEditablesEnabled = EnableInsert || EnableUpdate || EnableDelete;
1140 // Cannot edit of EntitySetName has not been set.
1141 // Cannot edit if CommandText has been set.
1142 // Cannot edit if all EnableDelete/Insert/Update are false.
1143 // Cannot edit if Select has been set
1144 // Note that neither EntitySetName nor CommandText are strictly required if the user provides a query from OnSelecting.
1145 bool disableUpdatableness =
1146 String.IsNullOrEmpty(EntitySetName) ||
1147 !String.IsNullOrEmpty(CommandText) ||
1148 !anyEditablesEnabled ||
1149 !String.IsNullOrEmpty(Select) ||
1150 !String.IsNullOrEmpty(GroupBy);
1152 if (!String.IsNullOrEmpty(CommandText) &&
1153 !String.IsNullOrEmpty(EntitySetName))
1155 throw new InvalidOperationException(Strings.EntityDataSource_CommandTextOrEntitySetName);
1158 if (String.IsNullOrEmpty(CommandText) &&
1159 String.IsNullOrEmpty(EntitySetName))
1161 throw new InvalidOperationException(Strings.EntityDataSource_CommandTextOrEntitySetNameRequired);
1164 if (anyEditablesEnabled && !String.IsNullOrEmpty(CommandText))
1166 throw new InvalidOperationException(Strings.EntityDataSource_CommandTextNotEditable);
1169 if (anyEditablesEnabled && !String.IsNullOrEmpty(Select))
1171 throw new InvalidOperationException(Strings.EntityDataSource_SelectNotEditable);
1174 if (anyEditablesEnabled && !String.IsNullOrEmpty(GroupBy))
1176 throw new InvalidOperationException(Strings.EntityDataSource_GroupByNotEditable);
1179 if (!String.IsNullOrEmpty(Where) && AutoGenerateWhereClause)
1181 throw new InvalidOperationException(Strings.EntityDataSource_AutoGenerateWhereNotAllowedIfWhereDefined);
1184 if (!String.IsNullOrEmpty(OrderBy) && AutoGenerateOrderByClause)
1186 throw new InvalidOperationException(Strings.EntityDataSource_AutoGenerateOrderByNotAllowedIfOrderByIsDefined);
1189 if (0 < WhereParameters.Count && !AutoGenerateWhereClause && String.IsNullOrEmpty(Where))
1191 throw new InvalidOperationException(Strings.EntityDataSource_WhereParametersNeedsWhereOrAutoGenerateWhere);
1194 if (0 < OrderByParameters.Count && !AutoGenerateOrderByClause && String.IsNullOrEmpty(OrderBy))
1196 throw new InvalidOperationException(Strings.EntityDataSource_OrderByParametersNeedsOrderByOrAutoGenerateOrderBy);
1199 if (0 < CommandParameters.Count && String.IsNullOrEmpty(CommandText))
1201 throw new InvalidOperationException(Strings.EntityDataSource_CommandParametersNeedCommandText);
1204 if (0 < SelectParameters.Count && String.IsNullOrEmpty(Select))
1206 throw new InvalidOperationException(Strings.EntityDataSource_SelectParametersNeedSelect);
1209 if (!String.IsNullOrEmpty(GroupBy) && String.IsNullOrEmpty(Select))
1211 throw new InvalidOperationException(Strings.EntityDataSource_GroupByNeedsSelect);
1214 if (!String.IsNullOrEmpty(EntityTypeFilter) && !String.IsNullOrEmpty(CommandText))
1216 throw new InvalidOperationException(Strings.EntityDataSource_CommandTextCantHaveEntityTypeFilter);
1219 if (!String.IsNullOrEmpty(EntitySetName))
1221 View.ValidateEntitySetName();
1224 return disableUpdatableness;
1227 internal bool ValidateWrappable()
1235 /// Determines if the EntityDataSource is configured to return results that have an identity or not
1236 /// (i.e. the entities have some set of primary keys)
1238 internal bool HasIdentity()
1241 String.IsNullOrEmpty(CommandText) &&
1242 String.IsNullOrEmpty(Select) &&
1243 String.IsNullOrEmpty(GroupBy);
1246 #endregion Error Checking