public virtual void Initialize(IModelObject model)
{
try
{
_model = (ModelRoot)model;
var hasMetaData = false;
foreach (var table in (from x in _model.Database.Tables where x.Generated orderby x.Name select x))
{
if (table.CreateMetaData)
hasMetaData = true;
}
Table projectItemDataType = null;
if (hasMetaData)
{
#region Create the PROPERTY_ITEM_DATA_TYPE table
projectItemDataType = _model.Database.Tables.Add("PROPERTY_ITEM_DATA_TYPE");
projectItemDataType.IsMetaDataMaster = true;
Column column = null;
column = _model.Database.Columns.Add("property_item_data_type_id");
column.ParentTableRef = projectItemDataType.CreateRef();
column.DataType = System.Data.SqlDbType.Int;
column.PrimaryKey = true;
column.Identity = IdentityTypeConstants.None;
column.AllowNull = false;
projectItemDataType.Columns.Add(column.CreateRef());
column = _model.Database.Columns.Add("name");
column.ParentTableRef = projectItemDataType.CreateRef();
column.DataType = System.Data.SqlDbType.VarChar;
column.Length = 50;
column.AllowNull = false;
projectItemDataType.Columns.Add(column.CreateRef());
#endregion
}
foreach (var table in (from x in _model.Database.Tables where x.Generated orderby x.Name select x))
{
if (table.CreateMetaData)
{
Column column = null;
#region Create the PROPERTY_ITEM_DEFINE table
var projectItemDefineTable = _model.Database.Tables.Add(table.DatabaseName + "_PROPERTY_ITEM_DEFINE");
projectItemDefineTable.IsMetaDataDefinition = true;
column = _model.Database.Columns.Add("property_item_define_id");
column.ParentTableRef = projectItemDefineTable.CreateRef();
column.DataType = System.Data.SqlDbType.Int;
column.PrimaryKey = true;
column.Identity = IdentityTypeConstants.Database;
column.AllowNull = false;
projectItemDefineTable.Columns.Add(column.CreateRef());
column = _model.Database.Columns.Add("name");
column.ParentTableRef = projectItemDefineTable.CreateRef();
column.DataType = System.Data.SqlDbType.VarChar;
column.Length = 50;
column.AllowNull = false;
column.UIVisible = true;
column.SortOrder = 0;
column.FriendlyName = "Name";
projectItemDefineTable.Columns.Add(column.CreateRef());
column = _model.Database.Columns.Add("property_item_data_type");
column.EnumType = "PropertyBagDataTypeConstants";
column.ParentTableRef = projectItemDefineTable.CreateRef();
column.DataType = System.Data.SqlDbType.Int;
column.UIVisible = true;
column.SortOrder = 1;
column.FriendlyName = "Data type";
column.AllowNull = false;
projectItemDefineTable.Columns.Add(column.CreateRef());
//RELATIONRELATIONRELATIONRELATIONRELATIONRELATIONRELATIONRELATIONRELATIONRELATION
//Add a relation to from the datatype table to this one
var relation2 = _model.Database.Relations.Add();
relation2.ParentTableRef = projectItemDataType.CreateRef();
relation2.ChildTableRef = projectItemDefineTable.CreateRef();
var relationship = new ColumnRelationship((INHydrateModelObject)relation2.Root);
relationship.ParentColumnRef = ((Column)projectItemDataType.Columns[0].Object).CreateRef();
relationship.ChildColumnRef = column.CreateRef();
relation2.ColumnRelationships.Add(relationship);
projectItemDataType.Relationships.Add(relation2.CreateRef());
//RELATIONRELATIONRELATIONRELATIONRELATIONRELATIONRELATIONRELATIONRELATIONRELATION
column = _model.Database.Columns.Add("group");
column.ParentTableRef = projectItemDefineTable.CreateRef();
column.DataType = System.Data.SqlDbType.VarChar;
column.Length = 50;
column.AllowNull = true;
column.UIVisible = true;
column.SortOrder = 2;
column.FriendlyName = "Group";
projectItemDefineTable.Columns.Add(column.CreateRef());
column = _model.Database.Columns.Add("sort_index");
column.ParentTableRef = projectItemDefineTable.CreateRef();
column.DataType = System.Data.SqlDbType.Int;
column.AllowNull = false;
column.UIVisible = true;
column.SortOrder = 3;
column.FriendlyName = "Sort order";
projectItemDefineTable.Columns.Add(column.CreateRef());
column = _model.Database.Columns.Add("minimum_value");
column.ParentTableRef = projectItemDefineTable.CreateRef();
column.DataType = System.Data.SqlDbType.VarChar;
column.Length = 50;
column.UIVisible = true;
column.SortOrder = 4;
column.FriendlyName = "Minimum value";
projectItemDefineTable.Columns.Add(column.CreateRef());
column = _model.Database.Columns.Add("maximum_value");
column.ParentTableRef = projectItemDefineTable.CreateRef();
column.DataType = System.Data.SqlDbType.VarChar;
column.Length = 50;
column.UIVisible = true;
column.SortOrder = 5;
column.FriendlyName = "Maximum value";
projectItemDefineTable.Columns.Add(column.CreateRef());
column = _model.Database.Columns.Add("max_length");
column.ParentTableRef = projectItemDefineTable.CreateRef();
column.DataType = System.Data.SqlDbType.Int;
column.UIVisible = true;
column.SortOrder = 6;
column.FriendlyName = "Maximum Length";
projectItemDefineTable.Columns.Add(column.CreateRef());
column = _model.Database.Columns.Add("is_required");
column.ParentTableRef = projectItemDefineTable.CreateRef();
column.DataType = System.Data.SqlDbType.Bit;
column.AllowNull = false;
column.UIVisible = true;
column.SortOrder = 7;
column.FriendlyName = "Required";
projectItemDefineTable.Columns.Add(column.CreateRef());
#endregion
#region Create the PROPERTY_ITEM table
var projectItemValueTable = _model.Database.Tables.Add(table.DatabaseName + "_PROPERTY_ITEM");
projectItemValueTable.IsMetaData = true;
column = _model.Database.Columns.Add("property_item_id");
column.ParentTableRef = projectItemValueTable.CreateRef();
column.DataType = System.Data.SqlDbType.Int;
column.PrimaryKey = true;
column.AllowNull = false;
column.Identity = IdentityTypeConstants.Database;
projectItemValueTable.Columns.Add(column.CreateRef());
column = _model.Database.Columns.Add("property_item_define_id");
column.ParentTableRef = projectItemValueTable.CreateRef();
column.DataType = System.Data.SqlDbType.Int;
column.AllowNull = false;
projectItemValueTable.Columns.Add(column.CreateRef());
column = _model.Database.Columns.Add("item_value");
column.ParentTableRef = projectItemValueTable.CreateRef();
column.DataType = System.Data.SqlDbType.VarChar;
column.Length = 1024;
column.AllowNull = false;
projectItemValueTable.Columns.Add(column.CreateRef());
//Create all primary keys
foreach (var pkColumn in table.PrimaryKeyColumns.OrderBy(x => x.Name))
{
column = _model.Database.Columns.Add(pkColumn.DatabaseName);
column.ParentTableRef = projectItemValueTable.CreateRef();
column.DataType = pkColumn.DataType;
column.Length = pkColumn.Length;
column.AllowNull = false;
projectItemValueTable.Columns.Add(column.CreateRef());
}
//Add relationship between Definition and Value table
if (true)
{
var relation = new Relation(this._model);
relation.ParentTableRef = projectItemDefineTable.CreateRef();
relation.ChildTableRef = projectItemValueTable.CreateRef();
var colRel = new ColumnRelationship(_model);
colRel.ParentColumnRef = projectItemDefineTable.Columns["property_item_define_id"];
colRel.ChildColumnRef = projectItemValueTable.Columns["property_item_define_id"];
relation.ColumnRelationships.Add(colRel);
relation.RoleName = string.Empty;
_model.Database.Relations.Add(relation);
projectItemDefineTable.Relationships.Add(relation.CreateRef());
}
//Add relationship between Value table and primary table
if (true)
{
var relation = new Relation(this._model);
relation.ParentTableRef = table.CreateRef();
relation.ChildTableRef = projectItemValueTable.CreateRef();
foreach (var pkColumn in table.PrimaryKeyColumns.OrderBy(x => x.Name))
{
var colRel = new ColumnRelationship(_model);
colRel.ParentColumnRef = table.Columns[pkColumn.DatabaseName];
colRel.ChildColumnRef = projectItemValueTable.Columns[pkColumn.DatabaseName];
relation.RoleName = string.Empty;
relation.ColumnRelationships.Add(colRel);
table.Relationships.Add(relation.CreateRef());
}
_model.Database.Relations.Add(relation);
}
#endregion
}
}
//_model = (ModelRoot)model;
}
catch (Exception ex)
{
throw;
}
}