|
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;
}
}
}
|