public virtual void SetOtherKey(string literalOtherKey, MetaTable thisTable, MetaTable otherTable, MetaDataMember otherAssociationMember)
 {
     var comma = new[] { ',' };
     var otherKeysList = new List<MetaDataMember>();
     if (literalOtherKey != null)
     {
         foreach (var otherKeyRaw in literalOtherKey.Split(comma, StringSplitOptions.RemoveEmptyEntries))
         {
             var otherKey = otherKeyRaw.Trim();
             //we need to revisit this code - it has caused problems on both MySql and Pgsql
             MemberInfo[] otherKeyFields = otherTable.RowType.Type.GetMember(otherKey);
             if (otherKeyFields.Length == 0)
             {
                 string msg = "ERROR L57 Database contains broken join information."
                     + " thisTable=" + thisTable.TableName
                     + " otherTable=" + otherTable.TableName
                     + " orphanKey=" + literalOtherKey;
                 throw new InvalidOperationException(msg);
             }
             var keyMember = otherKeyFields[0];
             otherKeysList.Add(new AttributedColumnMetaDataMember(keyMember, GetColumnAttribute(keyMember),
                                                                  thisTable.RowType));
         }
     }
     otherKeys = new ReadOnlyCollection<MetaDataMember>(otherKeysList);
     otherMember = otherAssociationMember;
 }
        public string CreateTableSQL(
            MetaTable table)
        {
            StringBuilder sqlText = new StringBuilder();

            sqlText.AppendFormat("CREATE TABLE {0}(\r\n", table.TableName);

            for (int memberIndex = 0; memberIndex < table.RowType.DataMembers.Count; memberIndex++)
            {
                MetaDataMember member = table.RowType.DataMembers[memberIndex];
                bool isLastColomn = memberIndex >= table.RowType.DataMembers.Count - 1;

                if (!member.IsAssociation)
                {
                    sqlText.AppendFormat("\t{0}{1}\r\n",
                        CreateColomnSQL(table, member),
                        isLastColomn ? "" : ",");
                }
            }

            // TODO: Foreign key associations

            sqlText.Append(");\r\n");

            return sqlText.ToString();
        }
示例#3
0
		internal SqlTable(MetaTable table, MetaType rowType, ProviderType sqlRowType, Expression sourceExpression)
			: base(SqlNodeType.Table, sourceExpression) {
			this.table = table;
			this.rowType = rowType;
			this.sqlRowType = sqlRowType;
			this.columns = new List<SqlColumn>();
			}
 public RepositoryMetaTable(string workspace, MetaTable orig, MetaModel model)
 {
     this.Workspace = workspace;
     this.Original = orig;
     this.RepositoryMetaModel = model;
     this.RepositoryMetaType = new RepositoryMetaType(workspace, orig.RowType, this, model);
 }
 public RepositoryMetaType(string workspace, MetaType original, MetaTable table, MetaModel metaModel)
 {
     this.Workspace = workspace;
     this.Original = original;
     this.RepositoryMetaTable = table;
     this.RepositoryMetaModel = metaModel;
 }
示例#6
0
        public CustomMetaTable(MetaTable table, MetaModel model)
        {
            _table = table;
            _model = model;

            _tableName = (_table.TableName.Contains(".") ? "" : "dbo.") + _table.TableName;

            var tableNameField = table.GetType().GetField("tableName", BindingFlags.NonPublic | BindingFlags.Instance);
            tableNameField.SetValue(_table, _tableName);
        }
        public string DeleteTableSQL(
            MetaTable table)
        {
            StringBuilder sqlText = new StringBuilder();

            sqlText.AppendFormat("IF OBJECT_ID('{0}', 'U') IS NOT NULL\r\n", table.TableName);
            sqlText.AppendFormat("DROP TABLE {0};\r\n", table.TableName);

            return sqlText.ToString();
        }
 internal static void BuildFieldDeclarations(MetaTable table, StringBuilder sb) {
     int n = 0;
     Dictionary<object, string> memberNameToMappedName = new Dictionary<object, string>();
     foreach (MetaType type in table.RowType.InheritanceTypes) {
         n += BuildFieldDeclarations(type, memberNameToMappedName, sb);
     }
     if (n == 0) {
         throw Error.CreateDatabaseFailedBecauseOfClassWithNoMembers(table.RowType.Type);
     }
 }
示例#9
0
		private object locktarget = new object(); // Hold locks on private object rather than public MetaType.
		#endregion

		internal MappedType(MetaModel model, MetaTable table, TypeMapping typeMapping, Type type, MetaType inheritanceRoot)
		{
			this.model = model;
			this.table = table;
			this.typeMapping = typeMapping;
			this.type = type;
			this.inheritanceRoot = inheritanceRoot != null ? inheritanceRoot : this;
			this.InitDataMembers();

			this.identities = this.dataMembers.Where(m => m.IsPrimaryKey).ToList().AsReadOnly();
			this.persistentDataMembers = this.dataMembers.Where(m => m.IsPersistent).ToList().AsReadOnly();
		}
		object locktarget = new object(); // Hold locks on private object rather than public MetaType.

		internal AttributedMetaType(MetaModel model, MetaTable table, Type type, MetaType inheritanceRoot)
		{
			this.model = model;
			this.table = table;
			this.type = type;
			this.inheritanceRoot = (inheritanceRoot != null) ? inheritanceRoot : this;
			// Not lazy-loading to simplify locking and enhance performance 
			// (because no lock will be required for the common read scenario).
			this.InitDataMembers();
			this.identities = this.dataMembers.Where(m => m.IsPrimaryKey).ToList().AsReadOnly();
			this.persistentMembers = this.dataMembers.Where(m => m.IsPersistent).ToList().AsReadOnly();
		}
		public DLinqTableProvider (DataModelProvider owner, DMetaTable meta)
			: base (owner)
		{
			EntityType = meta.RowType.Type;

			Name = meta.TableName;
			int idx = Name.LastIndexOf ('.');
			Name = idx < 0 ? Name : Name.Substring (idx + 1);

			var l = new List<ColumnProvider> ();
			foreach (var c in meta.RowType.DataMembers)
				l.Add (new DLinqColumnProvider (this, c));
			columns = new ReadOnlyCollection<ColumnProvider> (l);
		}
示例#12
0
			public DataBossRowType(MetaTable table, Type type) {
				this.table = table;
				this.type = type;

				foreach(var item in type.GetFields()) {
					var linqColumn = item.GetCustomAttributes(typeof(System.Data.Linq.Mapping.ColumnAttribute)).Cast<System.Data.Linq.Mapping.ColumnAttribute>().SingleOrDefault();
					if(linqColumn != null) {
						members.Add(new DataBossDataMember(this, item, item.FieldType, linqColumn.Name));
					}
					var column = item.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.Schema.ColumnAttribute)).Cast<System.ComponentModel.DataAnnotations.Schema.ColumnAttribute>().SingleOrDefault();
					if(column != null) {
						members.Add(new DataBossDataMember(this, item, item.FieldType, item.Name));
					}
				}
			}
示例#13
0
        public DLinqTableProvider(DataModelProvider owner, DMetaTable meta)
            : base(owner)
        {
            EntityType = meta.RowType.Type;

            Name = meta.TableName;
            int idx = Name.LastIndexOf('.');

            Name = idx < 0 ? Name : Name.Substring(idx + 1);

            var l = new List <ColumnProvider> ();

            foreach (var c in meta.RowType.DataMembers)
            {
                l.Add(new DLinqColumnProvider(this, c));
            }
            columns = new ReadOnlyCollection <ColumnProvider> (l);
        }
示例#14
0
 internal static string GetCreateTableCommand(MetaTable table) {
     StringBuilder sb = new StringBuilder();
     StringBuilder decl = new StringBuilder();
     BuildFieldDeclarations(table, decl);
     sb.AppendFormat("CREATE TABLE {0}", SqlIdentifier.QuoteCompoundIdentifier(table.TableName));
     sb.Append("(");
     sb.Append(decl.ToString());
     decl = new StringBuilder();
     BuildPrimaryKey(table, decl);
     if (decl.Length > 0) {
         string name = String.Format(Globalization.CultureInfo.InvariantCulture, "PK_{0}", table.TableName);
         sb.Append(", ");
         sb.AppendLine();
         sb.AppendFormat("  CONSTRAINT {0} PRIMARY KEY ({1})", SqlIdentifier.QuoteIdentifier(name), decl.ToString());
     }
     sb.AppendLine();
     sb.Append("  )");
     return sb.ToString();
 }
示例#15
0
        internal static string GetCreateSchemaForTableCommand(MetaTable table) {
            StringBuilder sb = new StringBuilder();
            List<string> parts = new List<string>(SqlIdentifier.GetCompoundIdentifierParts(table.TableName));

            // table names look like this in Yukon (according to MSDN):
            //     [ database_name . [ schema_name ] . | schema_name . ] table_name 
            // ... which means that either way, the schema name is the second to last part.

            if ((parts.Count) < 2) {
                return null;
            }
            
            string schema = parts[parts.Count - 2];
            if (String.Compare(schema, "DBO", StringComparison.OrdinalIgnoreCase) != 0 &&
                String.Compare(schema, "[DBO]", StringComparison.OrdinalIgnoreCase) != 0) {
                sb.AppendFormat("CREATE SCHEMA {0}", SqlIdentifier.QuoteIdentifier(schema));
            }
            return sb.ToString();
        }
        public string CreateColomnSQL(
            MetaTable table,
            MetaDataMember member)
        {
            StringBuilder sqlText = new StringBuilder();

            if (member.IsPrimaryKey)
            {
                sqlText.AppendFormat("{0} INTEGER PRIMARY KEY AUTOINCREMENT ", member.MappedName);
            }
            else
            {
                sqlText.AppendFormat("{0} {1} ", member.MappedName, member.DbType);
            }

            if (!member.CanBeNull)
            {
                sqlText.Append("NOT NULL");
            }

            return sqlText.ToString();
        }
        public string CreateColomnSQL(
            MetaTable table,
            MetaDataMember member)
        {
            StringBuilder sqlText = new StringBuilder();

            sqlText.AppendFormat("{0} {1} ", member.MappedName, FilterDBType(member.DbType));

            if (member.IsPrimaryKey)
            {
                sqlText.AppendFormat("IDENTITY(1,1) CONSTRAINT PK_{0} PRIMARY KEY CLUSTERED ", table.TableName);
            }

            // TODO: Foreign key associations

            if (!member.CanBeNull)
            {
                sqlText.Append("NOT NULL");
            }

            return sqlText.ToString();
        }
 /// <summary>
 /// Retrieves the table creation SQL command.
 /// </summary>
 /// <param name="metaTable">The meta table.</param>
 /// <returns></returns>
 private static string retrieveTableCreationSQL(MetaTable metaTable)
 {
     var typeName = "System.Data.Linq.SqlClient.SqlBuilder";
     var type = typeof(System.Data.Linq.DataContext).Assembly.GetType(typeName);
     var bf = BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod;
     var sql = type.InvokeMember("GetCreateTableCommand", bf, null, null, new[] { metaTable });
     var sqlAsString = sql.ToString();
     return sqlAsString;
 }
示例#19
0
 protected virtual IList<MemberInfo> GetAssociationKeys(MetaTable description, ReadOnlyCollection<MetaDataMember> keys,
                                                        DataContext dataContext)
 {
     var sourceKeys = keys;
     if (sourceKeys.Count == 0)
         sourceKeys = description.RowType.IdentityMembers;
     var members = (from key in sourceKeys select key.Member).ToList();
     return members;
 }
示例#20
0
		internal static IEnumerable<String> GetCreateForeignKeyCommands(MetaTable table)
		{
			foreach(MetaType type in table.RowType.InheritanceTypes)
			{
				foreach(string command in GetCreateForeignKeyCommands(type))
				{
					yield return command;
				}
			}
		}
示例#21
0
		private static void BuildPrimaryKey(MetaTable table, StringBuilder sb)
		{
			foreach(MetaDataMember mm in table.RowType.IdentityMembers)
			{
				if(sb.Length > 0)
				{
					sb.Append(", ");
				}
				sb.Append(SqlIdentifier.QuoteCompoundIdentifier(mm.MappedName));
			}
		}
 public string DeleteTableSQL(
     MetaTable table)
 {
     return string.Format("DROP TABLE IF EXISTS {0};", table.TableName);
 }
示例#23
0
        /// <summary>
        /// Enumerates Keys for a given table.
        /// Keys can be provided as input. If none provided, PKs are taken from table
        /// </summary>
        /// <param name="description"></param>
        /// <param name="keys">Keys to be used, leave empty to use PKs instead</param>
        /// <param name="dataContext"></param>
        /// <param name="hasNullableKeys">returned as true if some keys can be null (we then have an outer join)</param>
        /// <returns></returns>
        protected virtual IList<MemberInfo> GetAssociationKeys(MetaTable description, ReadOnlyCollection<MetaDataMember> keys,
                                                               DataContext dataContext, out bool hasNullableKeys)
        {
            var sourceKeys = keys;
            if (sourceKeys.Count == 0)
                sourceKeys = description.RowType.IdentityMembers;

            hasNullableKeys = false;
            var members = new List<MemberInfo>();
            foreach (var sourceKey in sourceKeys)
            {
                members.Add(sourceKey.Member);
                if (sourceKey.CanBeNull)
                    hasNullableKeys = true;
            }
            return members;
        }
示例#24
0
 public virtual IList<MemberInfo> GetPrimaryKeys(MetaTable tableDescription)
 {
     return (from column in tableDescription.RowType.IdentityMembers select column.Member).ToList();
 }
示例#25
0
 internal SqlTable Table(MetaTable table, MetaType rowType, Expression sourceExpression) {
     return new SqlTable(table, rowType, this.typeProvider.GetApplicationType((int)ConverterSpecialTypes.Row), sourceExpression);
 }
 internal void SetMetaTable(MetaTable metaTable)
 {
     table = metaTable;
 }
示例#27
0
 /// <summary>
 /// Lists table mapped columns
 /// </summary>
 /// <param name="tableDescription"></param>
 /// <returns></returns>
 public IList<MemberInfo> GetColumns(MetaTable tableDescription)
 {
     return (from column in tableDescription.RowType.PersistentDataMembers select column.Member).ToList();
 }