using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Security.Principal; namespace System.Web.DynamicData.ModelProviders { /// <summary> /// Base provider class for tables. /// Each provider type (e.g. Linq To Sql, Entity Framework, 3rd party) extends this class. /// </summary> public abstract class TableProvider { private Type _rootEntityType; private string _dataContextPropertyName; internal TableProvider() { // for unit testing } /// <summary> /// ctor /// </summary> /// <param name="model">the model this table belongs to</param> protected TableProvider(DataModelProvider model) { if (model == null) { throw new ArgumentNullException("model"); } DataModel = model; } /// <summary> /// readable representation /// </summary> /// <returns></returns> [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")] public override string ToString() { // To help identifying objects in debugger return Name ?? base.ToString(); } /// <summary> /// Provides access to attributes defined for the table represented by this provider. /// </summary> public virtual AttributeCollection Attributes { get { return GetTypeDescriptor().GetAttributes(); } } public virtual ICustomTypeDescriptor GetTypeDescriptor() { return TypeDescriptor.GetProvider(EntityType).GetTypeDescriptor(EntityType); } /// <summary> /// The name of the table. Typically, this is the name of the property in the data context class /// </summary> public virtual string Name { get; protected set; } /// <summary> /// The CLR type that represents this table /// </summary> public virtual Type EntityType { get; protected set; } /// <summary> /// The collection of columns in this table /// </summary> public abstract ReadOnlyCollection<ColumnProvider> Columns { get; } /// <summary> /// The IQueryable that returns the elements of this table /// </summary> public abstract IQueryable GetQuery(object context); /// <summary> /// The data model provider that this table is part of /// </summary> public DataModelProvider DataModel { get; internal set; } /// <summary> /// Get the value of a foreign key for a given row. By default, it just looks up a property by that name /// </summary> public virtual object EvaluateForeignKey(object row, string foreignKeyName) { return System.Web.UI.DataBinder.GetPropertyValue(row, foreignKeyName); } /// <summary> /// Return the parent type of this entity's inheritance hierarchy; if the type is at the top /// of an inheritance hierarchy or does not have any inheritance, will return null. /// </summary> public virtual Type ParentEntityType { get; protected set; } /// <summary> /// Return the root type of this entity's inheritance hierarchy; if the type is at the top /// of an inheritance hierarchy or does not have any inheritance, will return EntityType. /// </summary> public virtual Type RootEntityType { get { return _rootEntityType ?? EntityType; } protected set { _rootEntityType = value; } } /// <summary> /// Name of table coming from the property on the data context. E.g. the value is "Products" for /// a table that is part of the NorthwindDataContext.Products collection. If this value has not /// been set, it will return the value of the Name property. /// </summary> public virtual string DataContextPropertyName { get { return _dataContextPropertyName ?? Name; } protected set { _dataContextPropertyName = value; } } /// <summary> /// Returns whether the passed in user is allowed to delete items from the table /// </summary> public virtual bool CanDelete(IPrincipal principal) { if (principal == null) { throw new ArgumentNullException("principal"); } return true; } /// <summary> /// Returns whether the passed in user is allowed to insert into the table /// </summary> public virtual bool CanInsert(IPrincipal principal) { if (principal == null) { throw new ArgumentNullException("principal"); } return true; } /// <summary> /// Returns whether the passed in user is allowed to read from the table /// </summary> public virtual bool CanRead(IPrincipal principal) { if (principal == null) { throw new ArgumentNullException("principal"); } return true; } /// <summary> /// Returns whether the passed in user is allowed to make changes tothe table /// </summary> public virtual bool CanUpdate(IPrincipal principal) { if (principal == null) { throw new ArgumentNullException("principal"); } return true; } } }