Click here to Skip to main content
15,893,487 members
Articles / Web Development / ASP.NET

Generate SQL Database Schema from XML - Part 2 (Code Model)

Rate me:
Please Sign up or sign in to vote.
4.83/5 (10 votes)
29 Nov 2010CPOL11 min read 42.5K   1.1K   25  
Part 2 of 3 in a series of articles about generating SQL from an XML file format. This part describes the development of a code model for the new file format.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DatabaseSchemaModel.Raw;

namespace DatabaseSchemaModel
{
	/// <summary>
	/// Description of a database table relationship, from the perspective of the foreign
	/// key table.
	/// </summary>
	public class Relationship
	{
		/// <summary>
		/// The name of the relationship.
		/// </summary>
		public string Name;

		/// <summary>
		/// The foreign key columns included in this relationship.
		/// </summary>
		public List<Column> ForeignKeyColumns = new List<Column>();

		/// <summary>
		/// The primary key table that the relationship is with.
		/// </summary>
		public Table PrimaryKeyTable = null;

		/// <summary>
		/// The primary key columns from the primary key table that are included in this relationship.
		/// </summary>
		public List<Column> PrimaryKeyColumns = new List<Column>();

		/// <summary>
		/// Initializes a new instance of the <see cref="Relationship"/> class.
		/// </summary>
		public Relationship()
		{ }

		/// <summary>
		/// Initializes a new instance of the <see cref="Relationship"/> class.
		/// </summary>
		/// <param name="context">The context.</param>
		/// <param name="raw">The raw description from the XML.</param>
		internal Relationship(
			ReadContext context,
			relationship raw
			)
		{
			context.Stack.Push("Reading Relationship: " + context.ReadingTableItem);

			Name = raw.name;
			relationshipColumn[] rawPrimaryKeyTableColumns = raw.primaryKeyTable.column;

			string stackTrace = context.StackTrace;

			foreach(relationshipColumn rawRelationshipColumn in raw.foreignKeyColumns)
			{
				ForeignKeyColumns.Add(context.ReadingTable.ResolveColumn(stackTrace, rawRelationshipColumn.name));
			}
			context.ResolveTableReferences.Add(raw.primaryKeyTable.name, delegate(Table table)
			{
				PrimaryKeyTable = table;
				foreach (relationshipColumn rawRelationshipColumn in rawPrimaryKeyTableColumns)
				{
					PrimaryKeyColumns.Add(table.ResolveColumn(stackTrace, rawRelationshipColumn.name));
				}
			});
			context.Stack.Pop();
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior) Olduwan Ltd.
United Kingdom United Kingdom
Entertainment software.
Web development.

Comments and Discussions