Click here to Skip to main content
13,667,639 members
Click here to Skip to main content
Add your own
alternative version

Tagged as


89 bookmarked
Posted 23 Nov 2011
Licenced GPL3

Millennials - A Custom Source Code Generator

, 6 Jul 2012
Rate this:
Please Sign up or sign in to vote.
Custom code generator for C# programming language. Supports MVC and three-tier architecture; ADO.NET, NHibernate and LINQ data access
Millennials sample image


The request for software development has grown significantly in the last years. Complex projects with tight deadlines are increasingly present in the software factories reality. When the project is not structured in an organized way from the beginning, it may face considerable problems in the future, as the risk of compromising the final product and even the own company.

In this article, I will introduce Millennials. The objective of this software is create automatically a .NET solution with custom source code with your desired software architecture.


Automating repetitive coding tasks is a good way to save time in the software development lifecycle. In addition to creating an organized code following a development pattern, the time saved with these tasks can be used in another phase of software development lifecycle, like tests and design.

Millennials is a custom source code generator which user, based on a SQL Server database, can generate a .NET solution with the data models, data access layer and business layer through a wizard. In this wizard, the user can choose between two software architectures (MVC and three-tier) and three data access technologies (ADO .NET, Nhibernate and LINQ).

I developed it by myself in the last year of my computer engineering graduation. I also attached the monograph of this project (unfortunately, only in Portuguese). The link is on the top of the page, below the source code download.

Using Millennials

Millennials is a wizard-based software. It's very easy to create a .NET solution with your own custom source code. I will explain step by step how to use it.

Creating a New Project

In the main menu, click on "Project". After this, click on "New". The first screen is a form to connect into the SQL Server. You can choose which authentication will be used and once you are logged in, you can choose a database.

Step 1

In the next step, you will be able to select which tables and fields will be included in your .NET solution.

Step 2

In the next step, you will be able to input the .NET solution name, which project architecture and data access type will be used.

Step 3

In this last step, you will be able to select the .NET solution's destination folder and configure each .NET solution's project.

Step 4

Click in the Finish button and your .NET solution will be created.

Creating a New Template

In the creation project's last step, Millennials allows you to link each .NET solution's project to a template. Millennials has a default template for each project coding lines but you can create your own template. In this session, I will explain how to do it.

In the main menu, Click on "Template". After this, click on "New". This form allows you to create your own template using special tags mixed with C# coding lines.

Creating a new template

Static codes can be included in the template as normal C# coding lines. Variable codes are represented by special tags which Millennials will replace by the corresponding values in the creation process. There is a legend available in this screen that explains each tag and how to use it correctly.

The Code Behind Millennials

Millennials was developed using Microsoft Visual Studio 2008 and C#. It was organized in 6 projects:

  • Millennials.Business - Contains the class responsible to retrieve information from SQL Server database.
  • Millennials.Creator - Contains the class responsible to create the solution, projects and classes.
  • Millennials.Data - Contains the classes with the coding lines to retrieve information from SQL Server database.
  • Millennials.Model - Contains the model classes to help in the .NET solution creation process.
  • Millennials.UI - Contains the user interface forms.
  • Millennials.Util - Contains common coding lines for all projects as Enums.

Millennials Class Diagram

Class Diagram

Class Diagram

Points of Interest

To allow the user to see the coding lines like a C# editor in the template creation/edition step, I use the great ICSharpCode.TextEditor.

Create a .NET solution with projects within is easier than it looks. Files with extensions sln and csproj are just XML files linked to each other by a GUID. These coding lines are in Millennials.Creator project.

To retrieve the database's table information from SQL Server, I use the information_schema schema. These coding lines are in Millennials.Data project. Here is a code snippet:

public List<Column> ListColumnsByTable(Table table, SqlConnectionStringBuilder conn)
	List<Column> lstColumns = new List<Column>();
	using (SqlConnection dbConnection = new SqlConnection(conn.ConnectionString))
		StringBuilder strBuilder = new StringBuilder();
		SqlCommand cmd = new SqlCommand();

		strBuilder.Append("select ");
		strBuilder.Append("a.column_name as column_name, ");
		strBuilder.Append("CASE a.is_nullable ");
		strBuilder.Append("WHEN 'YES' THEN 1 ");
		strBuilder.Append("ELSE 0 ");
		strBuilder.Append("END as nullable, ");
		strBuilder.Append("a.data_type as type, ");
		strBuilder.Append("a.character_maximum_length as 
				character_maximum_length, ");
		strBuilder.Append("(SELECT count([sc].[name]) as possue ");
		strBuilder.Append("FROM sys.indexes [si] ");
		strBuilder.Append("JOIN ");
		strBuilder.Append("sys.index_columns [sic] ");
		strBuilder.Append("ON ");
		strBuilder.Append("[si].[object_id] = [sic].[object_id] AND ");
		strBuilder.Append("[si].[index_id] = [sic].[index_id] ");
		strBuilder.Append("JOIN ");
		strBuilder.Append("sys.columns [sc] ");
		strBuilder.Append("ON ");
		strBuilder.Append("[sic].[object_id] = [sc].[object_id] AND ");
		strBuilder.Append("[sic].[column_id] = [sc].[column_id] "); 
		strBuilder.Append("WHERE [si].[is_primary_Key] = 1 ");
		strBuilder.Append("and [sc].[name] = a.column_name ");
		strBuilder.Append("and OBJECT_NAME([si].[object_id]) = a.table_name ");
		strBuilder.Append(") as primary_key, ");
		strBuilder.Append("( ");
		strBuilder.Append("select ");
		strBuilder.Append("count(ccu.column_name) as possue ");
			("from information_schema.constraint_column_usage ccu ");
			("inner join information_schema.table_constraints tc "); 
		strBuilder.Append("on (ccu.constraint_name = tc.constraint_name) ");
		strBuilder.Append("where tc.Constraint_Type = 'FOREIGN KEY' ");
		strBuilder.Append("and ccu.table_name = a.table_name ");
		strBuilder.Append("and ccu.column_name = a.column_name ");
		strBuilder.Append(") as foreign_key ");
		strBuilder.Append("from information_schema.columns a ");
		strBuilder.Append("inner join  information_schema.tables b "); 
		strBuilder.Append("on (a.table_name = b.table_name) ");
		strBuilder.Append("where a.table_name = @tableName ");

		SqlParameter data = new SqlParameter("@tableName", SqlDbType.NChar);
		data.Value = table.Name;

		cmd.CommandText = strBuilder.ToString();
		cmd.CommandType = CommandType.Text;
		cmd.Connection = dbConnection;

		SqlDataReader reader = cmd.ExecuteReader();
		while (reader.Read())
			Column column = new Column();
			column.ForeignKey = Convert.ToBoolean(reader["foreign_key"]);
			column.PrimaryKey = Convert.ToBoolean(reader["primary_key"]);
			if (reader["character_maximum_length"] != DBNull.Value)
				column.CharacterMaximumLength = 
			column.Name = reader["column_name"].ToString();
			column.Nullable = Convert.ToBoolean(reader["nullable"]);
			column.Type = reader["type"].ToString();
			column.Table = table;

	return lstColumns;


I hope this software helps many developers around the world not just in the software development lifecycle but to start a new way of thinking about software development. We can save time with automatic coding lines and get more time to spend on creativity and innovation. I have some ideas for future release versions like expand it to other programming languages, help with layout creation, basic business flows... anyway, there are a lot of things to do and all of you are able to modify this software to help our developer's world wide community.


  • Version 1.0 released in November, 2010 (only in Portuguese)
  • Version 2.0 released in November, 2011 (English)


This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)


About the Author

Brazil Brazil
Computer engineer

You may also be interested in...


Comments and Discussions

GeneralMy vote of 5 Pin
Member 1135957514-Jun-16 15:32
memberMember 1135957514-Jun-16 15:32 
GeneralMy vote of 5 Pin
manoj.jsm15-May-13 1:46
membermanoj.jsm15-May-13 1:46 
QuestionTest on Northwind database failed. Pin
Highflyer20-Apr-13 5:56
memberHighflyer20-Apr-13 5:56 
GeneralMy vote of 5 Pin
rajn_mca6-Feb-13 21:26
memberrajn_mca6-Feb-13 21:26 
GeneralMy vote of 5 Pin
Kanasz Robert5-Nov-12 2:42
mvpKanasz Robert5-Nov-12 2:42 
GeneralMy vote of 5 Pin
Devesh Sinha3-Sep-12 0:23
memberDevesh Sinha3-Sep-12 0:23 
Questionbinary and image data types Pin
Member 30205429-Jul-12 4:01
memberMember 30205429-Jul-12 4:01 
QuestionImprove support t4 template Pin
jun chan7-Jul-12 1:47
memberjun chan7-Jul-12 1:47 
AnswerRe: Improve support t4 template Pin
mauriciobarros8-Jul-12 11:24
membermauriciobarros8-Jul-12 11:24 
Question5 is 5! Pin
Aamer Alduais6-Jul-12 19:22
memberAamer Alduais6-Jul-12 19:22 
GeneralRe: 5 is 5! Pin
mauriciobarros8-Jul-12 11:22
membermauriciobarros8-Jul-12 11:22 
GeneralMy vote of 5 Pin
Md. Marufuzzaman1-Jan-12 17:30
mvpMd. Marufuzzaman1-Jan-12 17:30 
QuestionError upon building solution Pin
Alino 34816-Dec-11 23:45
memberAlino 34816-Dec-11 23:45 
AnswerRe: Error upon building solution Pin
mauriciobarros7-Dec-11 1:00
membermauriciobarros7-Dec-11 1:00 
GeneralRe: Error upon building solution Pin
Alino 34817-Dec-11 1:20
memberAlino 34817-Dec-11 1:20 
GeneralMy vote of 5 Pin
Tushar_Patil23-Nov-11 18:11
memberTushar_Patil23-Nov-11 18:11 
QuestionGood Job Pin
Rafael_Teodoro23-Nov-11 8:01
memberRafael_Teodoro23-Nov-11 8:01 
GeneralMy vote of 5 Pin
Pablo Aliskevicius23-Nov-11 4:39
memberPablo Aliskevicius23-Nov-11 4:39 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web05-2016 | 2.8.180820.1 | Last Updated 6 Jul 2012
Article Copyright 2011 by mauriciobarros
Everything else Copyright © CodeProject, 1999-2018
Layout: fixed | fluid