Advertisement
Guest User

Aaronaught

a guest
May 4th, 2010
279
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.17 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Data.Linq;
  5. using System.Data.Linq.Mapping;
  6. using System.Linq;
  7. using System.Reflection;
  8. using System.Text;
  9.  
  10. namespace LinqToSqlTest1
  11. {
  12.     class OverrideMappingSource : MappingSource
  13.     {
  14.         private readonly MappingSource innerSource;
  15.         private readonly List<TableOverride> tableOverrides = new List<TableOverride>();
  16.  
  17.         public OverrideMappingSource(MappingSource innerSource)
  18.         {
  19.             if (innerSource == null)
  20.                 throw new ArgumentNullException("innerSource");
  21.             this.innerSource = innerSource;
  22.         }
  23.  
  24.         protected override MetaModel CreateModel(Type dataContextType)
  25.         {
  26.             var innerModel = innerSource.GetModel(dataContextType);
  27.             return new OverrideMetaModel(this, innerModel, tableOverrides);
  28.         }
  29.  
  30.         public void OverrideTable(Type entityType, string tableName)
  31.         {
  32.             tableOverrides.Add(new TableOverride(entityType, tableName));
  33.         }
  34.     }
  35.  
  36.     class OverrideMetaModel : MetaModel
  37.     {
  38.         private readonly MappingSource source;
  39.         private readonly MetaModel innerModel;
  40.         private readonly List<TableOverride> tableOverrides = new List<TableOverride>();
  41.  
  42.         public OverrideMetaModel(MappingSource source, MetaModel innerModel,
  43.             IEnumerable<TableOverride> tableOverrides)
  44.         {
  45.             if (source == null)
  46.                 throw new ArgumentNullException("source");
  47.             if (innerModel == null)
  48.                 throw new ArgumentNullException("innerModel");
  49.             this.source = source;
  50.             this.innerModel = innerModel;
  51.             if (tableOverrides != null)
  52.                 this.tableOverrides.AddRange(tableOverrides);
  53.         }
  54.  
  55.         public override Type ContextType
  56.         {
  57.             get { return innerModel.ContextType; }
  58.         }
  59.  
  60.         public override string DatabaseName
  61.         {
  62.             get { return innerModel.DatabaseName; }
  63.         }
  64.  
  65.         public override MetaFunction GetFunction(MethodInfo method)
  66.         {
  67.             return innerModel.GetFunction(method);
  68.         }
  69.  
  70.         public override IEnumerable<MetaFunction> GetFunctions()
  71.         {
  72.             return innerModel.GetFunctions();
  73.         }
  74.  
  75.         public override MetaType GetMetaType(Type type)
  76.         {
  77.             return Wrap(innerModel.GetMetaType(type));
  78.         }
  79.  
  80.         public override MetaTable GetTable(Type rowType)
  81.         {
  82.             return Wrap(innerModel.GetTable(rowType));
  83.         }
  84.  
  85.         public override IEnumerable<MetaTable> GetTables()
  86.         {
  87.             return innerModel.GetTables().Select(t => Wrap(t));
  88.         }
  89.  
  90.         private MetaTable Wrap(MetaTable innerTable)
  91.         {
  92.             TableOverride ovr = tableOverrides.FirstOrDefault(o =>
  93.                 o.EntityType == innerTable.RowType.Type);
  94.             return (ovr != null) ? new OverrideMetaTable(this, innerTable, ovr.TableName) : innerTable;
  95.         }
  96.  
  97.         private MetaType Wrap(MetaType innerType)
  98.         {
  99.             TableOverride ovr = tableOverrides.FirstOrDefault(o =>
  100.                 o.EntityType == innerType.Type);
  101.             return (ovr != null) ?
  102.                 new OverrideMetaType(this, innerType, Wrap(innerType.Table)) : innerType;
  103.         }
  104.  
  105.         public override MappingSource MappingSource
  106.         {
  107.             get { return source; }
  108.         }
  109.  
  110.         public override Type ProviderType
  111.         {
  112.             get { return innerModel.ProviderType; }
  113.         }
  114.     }
  115.  
  116.     class OverrideMetaTable : MetaTable
  117.     {
  118.         private readonly MetaModel model;
  119.         private readonly MetaTable innerTable;
  120.         private readonly string tableName;
  121.  
  122.         public OverrideMetaTable(MetaModel model, MetaTable innerTable, string tableName)
  123.         {
  124.             if (model == null)
  125.                 throw new ArgumentNullException("model");
  126.             if (innerTable == null)
  127.                 throw new ArgumentNullException("innerTable");
  128.             if (string.IsNullOrEmpty(tableName))
  129.                 throw new ArgumentNullException("tableName");
  130.             this.model = model;
  131.             this.innerTable = innerTable;
  132.             this.tableName = tableName;
  133.         }
  134.  
  135.         public override MethodInfo DeleteMethod
  136.         {
  137.             get { return innerTable.DeleteMethod; }
  138.         }
  139.  
  140.         public override MethodInfo InsertMethod
  141.         {
  142.             get { return innerTable.InsertMethod; }
  143.         }
  144.  
  145.         public override MetaModel Model
  146.         {
  147.             get { return model; }
  148.         }
  149.  
  150.         public override MetaType RowType
  151.         {
  152.             get { return new OverrideMetaType(model, innerTable.RowType, this); }
  153.         }
  154.  
  155.         public override string TableName
  156.         {
  157.             get { return tableName; }
  158.         }
  159.  
  160.         public override MethodInfo UpdateMethod
  161.         {
  162.             get { return innerTable.UpdateMethod; }
  163.         }
  164.     }
  165.  
  166.     class OverrideMetaType : MetaType
  167.     {
  168.         private readonly MetaModel model;
  169.         private readonly MetaType innerType;
  170.         private readonly MetaTable overrideTable;
  171.  
  172.         public OverrideMetaType(MetaModel model, MetaType innerType, MetaTable overrideTable)
  173.         {
  174.             if (model == null)
  175.                 throw new ArgumentNullException("model");
  176.             if (innerType == null)
  177.                 throw new ArgumentNullException("innerType");
  178.             if (overrideTable == null)
  179.                 throw new ArgumentNullException("overrideTable");
  180.             this.model = model;
  181.             this.innerType = innerType;
  182.             this.overrideTable = overrideTable;
  183.         }
  184.  
  185.         public override ReadOnlyCollection<MetaAssociation> Associations
  186.         {
  187.             get { return innerType.Associations; }
  188.         }
  189.  
  190.         public override bool CanInstantiate
  191.         {
  192.             get { return innerType.CanInstantiate; }
  193.         }
  194.  
  195.         public override MetaDataMember DBGeneratedIdentityMember
  196.         {
  197.             get { return innerType.DBGeneratedIdentityMember; }
  198.         }
  199.  
  200.         public override ReadOnlyCollection<MetaDataMember> DataMembers
  201.         {
  202.             get { return innerType.DataMembers; }
  203.         }
  204.  
  205.         public override ReadOnlyCollection<MetaType> DerivedTypes
  206.         {
  207.             get { return innerType.DerivedTypes; }
  208.         }
  209.  
  210.         public override MetaDataMember Discriminator
  211.         {
  212.             get { return innerType.Discriminator; }
  213.         }
  214.  
  215.         public override MetaDataMember GetDataMember(MemberInfo member)
  216.         {
  217.             return innerType.GetDataMember(member);
  218.         }
  219.  
  220.         public override MetaType GetInheritanceType(Type type)
  221.         {
  222.             return innerType.GetInheritanceType(type);
  223.         }
  224.  
  225.         public override MetaType GetTypeForInheritanceCode(object code)
  226.         {
  227.             return innerType.GetTypeForInheritanceCode(code);
  228.         }
  229.  
  230.         public override bool HasAnyLoadMethod
  231.         {
  232.             get { return innerType.HasAnyLoadMethod; }
  233.         }
  234.  
  235.         public override bool HasAnyValidateMethod
  236.         {
  237.             get { return innerType.HasAnyValidateMethod; }
  238.         }
  239.  
  240.         public override bool HasInheritance
  241.         {
  242.             get { return innerType.HasInheritance; }
  243.         }
  244.  
  245.         public override bool HasInheritanceCode
  246.         {
  247.             get { return innerType.HasInheritanceCode; }
  248.         }
  249.  
  250.         public override bool HasUpdateCheck
  251.         {
  252.             get { return innerType.HasUpdateCheck; }
  253.         }
  254.  
  255.         public override ReadOnlyCollection<MetaDataMember> IdentityMembers
  256.         {
  257.             get { return innerType.IdentityMembers; }
  258.         }
  259.  
  260.         public override MetaType InheritanceBase
  261.         {
  262.             get { return innerType.InheritanceBase; }
  263.         }
  264.  
  265.         public override object InheritanceCode
  266.         {
  267.             get { return innerType.InheritanceCode; }
  268.         }
  269.  
  270.         public override MetaType InheritanceDefault
  271.         {
  272.             get { return innerType.InheritanceDefault; }
  273.         }
  274.  
  275.         public override MetaType InheritanceRoot
  276.         {
  277.             get { return innerType.InheritanceRoot; }
  278.         }
  279.  
  280.         public override ReadOnlyCollection<MetaType> InheritanceTypes
  281.         {
  282.             get { return innerType.InheritanceTypes; }
  283.         }
  284.  
  285.         public override bool IsEntity
  286.         {
  287.             get { return innerType.IsEntity; }
  288.         }
  289.  
  290.         public override bool IsInheritanceDefault
  291.         {
  292.             get { return innerType.IsInheritanceDefault; }
  293.         }
  294.  
  295.         public override MetaModel Model
  296.         {
  297.             get { return model; }
  298.         }
  299.  
  300.         public override string Name
  301.         {
  302.             get { return innerType.Name; }
  303.         }
  304.  
  305.         public override MethodInfo OnLoadedMethod
  306.         {
  307.             get { return innerType.OnLoadedMethod; }
  308.         }
  309.  
  310.         public override MethodInfo OnValidateMethod
  311.         {
  312.             get { return innerType.OnValidateMethod; }
  313.         }
  314.  
  315.         public override ReadOnlyCollection<MetaDataMember> PersistentDataMembers
  316.         {
  317.             get { return innerType.PersistentDataMembers; }
  318.         }
  319.  
  320.         public override MetaTable Table
  321.         {
  322.             get { return overrideTable; }
  323.         }
  324.  
  325.         public override Type Type
  326.         {
  327.             get { return innerType.Type; }
  328.         }
  329.  
  330.         public override MetaDataMember VersionMember
  331.         {
  332.             get { return innerType.VersionMember; }
  333.         }
  334.     }
  335.  
  336.  
  337.     class TableOverride
  338.     {
  339.         public TableOverride(Type entityType, string tableName)
  340.         {
  341.             if (entityType == null)
  342.                 throw new ArgumentNullException("entityType");
  343.             if (string.IsNullOrEmpty(tableName))
  344.                 throw new ArgumentNullException("tableName");
  345.             this.EntityType = entityType;
  346.             this.TableName = tableName;
  347.         }
  348.  
  349.         public Type EntityType { get; private set; }
  350.         public string TableName { get; private set; }
  351.     }
  352. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement