public void GetFieldsTest()
        {
            IDbSourceEntity source = new DbSourceEntity(this.m_dataSource, null, new SqlServerDatabaseEntityProvider());
            IEnumerable <IDbDatabaseEntity> databases = source.Databases;

            IEnumerable <IDbTableFieldEntity> fields = from database in databases
                                                       where database.Name.Equals("Xphter.Framework.Test")
                                                       from table in database.Tables
                                                       where table.Name.Equals("table0", StringComparison.OrdinalIgnoreCase)
                                                       from field in table.TableFields
                                                       select field;

            IDbTableFieldEntity primaryKeyField = (from field in fields
                                                   where field.Name.Equals("PrimaryKeyField", StringComparison.OrdinalIgnoreCase)
                                                   select field).FirstOrDefault();

            Assert.IsTrue(primaryKeyField != null);
            Assert.IsTrue(primaryKeyField.Constraints.Count() == 1);
            Assert.IsTrue(primaryKeyField.Constraints.First().Type == DbConstraintType.PrimaryKey);
            Assert.AreEqual <string>("int", primaryKeyField.DatabaseType);
            Assert.AreEqual <Type>(typeof(int), primaryKeyField.Type);

            IDbTableFieldEntity identityField = (from field in fields
                                                 where field.Name.Equals("IdentityField", StringComparison.OrdinalIgnoreCase)
                                                 select field).FirstOrDefault();

            Assert.IsTrue(identityField != null);
            Assert.IsTrue(identityField.IsIdentity);

            IDbTableFieldEntity uniqueKeyField0 = (from field in fields
                                                   where field.Name.Equals("UniqueField0", StringComparison.OrdinalIgnoreCase)
                                                   select field).FirstOrDefault();

            Assert.IsTrue(uniqueKeyField0 != null);
            Assert.IsTrue(uniqueKeyField0.Constraints.Count() == 1);
            Assert.IsTrue(uniqueKeyField0.Constraints.First().Type == DbConstraintType.UniqueKey);

            IDbTableFieldEntity uniqueKeyField1 = (from field in fields
                                                   where field.Name.Equals("UniqueField1", StringComparison.OrdinalIgnoreCase)
                                                   select field).FirstOrDefault();

            Assert.IsTrue(uniqueKeyField1 != null);
            Assert.IsTrue(uniqueKeyField1.Constraints.Count() == 2);
            Assert.IsTrue(uniqueKeyField1.Constraints.ElementAt(0).Type == DbConstraintType.UniqueKey);
            Assert.IsTrue(uniqueKeyField1.Constraints.ElementAt(1).Type == DbConstraintType.UniqueKey);
            //Assert.IsTrue(uniqueKeyField1.Constraints[2].Type == DbConstraintType.UniqueKey);
            Assert.IsTrue(uniqueKeyField1.HasDefaultValue);

            IDbTableFieldEntity uniqueKeyField2 = (from field in fields
                                                   where field.Name.Equals("UniqueField2", StringComparison.OrdinalIgnoreCase)
                                                   select field).FirstOrDefault();

            Assert.IsTrue(uniqueKeyField2 != null);
            Assert.IsTrue(uniqueKeyField2.Constraints.Count() == 1);
            Assert.IsTrue(uniqueKeyField2.Constraints.First().Type == DbConstraintType.UniqueKey);

            IDbTableFieldEntity foreignKeyField0 = (from field in fields
                                                    where field.Name.Equals("ForeignKey0", StringComparison.OrdinalIgnoreCase)
                                                    select field).FirstOrDefault();

            Assert.IsTrue(foreignKeyField0 != null);
            Assert.IsTrue(foreignKeyField0.Constraints.Count() == 1);
            Assert.IsTrue(foreignKeyField0.Constraints.First().ReferenceTable != null);
            Assert.AreEqual <string>("table1", foreignKeyField0.Constraints.First().ReferenceTable.Name);
            Assert.IsTrue(foreignKeyField0.ReferencedField != null);
            Assert.AreEqual <string>("PrimaryKey1", foreignKeyField0.ReferencedField.Name);

            IDbTableFieldEntity foreignKeyField1 = (from field in fields
                                                    where field.Name.Equals("ForeignKey1", StringComparison.OrdinalIgnoreCase)
                                                    select field).FirstOrDefault();

            Assert.IsTrue(foreignKeyField1 != null);
            Assert.IsTrue(foreignKeyField1.Constraints.Count() == 1);
            Assert.IsTrue(foreignKeyField1.Constraints.First().ReferenceTable != null);
            Assert.AreEqual <string>("table1", foreignKeyField1.Constraints.First().ReferenceTable.Name);
            Assert.IsTrue(foreignKeyField1.ReferencedField != null);
            Assert.AreEqual <string>("PrimaryKey0", foreignKeyField1.ReferencedField.Name);

            IDbTableFieldEntity uniqueIndexField0 = (from field in fields
                                                     where field.Name.Equals("UniqueIndexField0", StringComparison.OrdinalIgnoreCase)
                                                     select field).FirstOrDefault();

            Assert.IsTrue(uniqueIndexField0 != null);
            Assert.IsTrue(uniqueIndexField0.Constraints.Count() == 1);
            Assert.IsTrue(uniqueIndexField0.Constraints.First().Type == DbConstraintType.UniqueKey);

            IDbTableFieldEntity uniqueIndexField1 = (from field in fields
                                                     where field.Name.Equals("UniqueIndexField1", StringComparison.OrdinalIgnoreCase)
                                                     select field).FirstOrDefault();

            Assert.IsTrue(uniqueIndexField1 != null);
            Assert.IsTrue(uniqueIndexField1.Constraints.Count() == 1);
            Assert.IsTrue(uniqueIndexField1.Constraints.First().Type == DbConstraintType.UniqueKey);

            IDbTableFieldEntity descriptionField = (from field in fields
                                                    where field.Name.Equals("DescriptionField", StringComparison.OrdinalIgnoreCase)
                                                    select field).FirstOrDefault();

            Assert.IsTrue(descriptionField != null);
            Assert.AreEqual <string>("Field Description", descriptionField.Description);
            Assert.AreEqual <string>("varchar", descriptionField.DatabaseType);
            Assert.AreEqual <Type>(typeof(string), descriptionField.Type);
        }
Example #2
0
        /// <summary>
        /// Creates fields from the specified field items.
        /// </summary>
        /// <param name="table"></param>
        /// <param name="items"></param>
        private void CreateFileds(IDbTableEntity table, IDictionary <string, DbConstraintEntity> constraints, IEnumerable <FieldItem> items)
        {
            DbTableFieldEntity  field                       = null;
            DbConstraintEntity  constraint                  = null;
            IDbTableEntity      referencedTable             = null;
            IDbTableFieldEntity referencedField             = null;
            IDictionary <string, DbTableFieldEntity> fields = g_fieldsCache.ContainsKey(table) ?
                                                              g_fieldsCache[table] :
                                                              (g_fieldsCache[table] = new Dictionary <string, DbTableFieldEntity>());

            foreach (FieldItem item in items)
            {
                //determine referenced table and field
                referencedTable = string.IsNullOrWhiteSpace(item.ReferenceTable) ?
                                  null :
                                  (from t in table.Database.Tables
                                   where t.Name.Equals(item.ReferenceTable, StringComparison.OrdinalIgnoreCase)
                                   select t).FirstOrDefault();

                referencedField = string.IsNullOrWhiteSpace(item.ReferenceField) ?
                                  null :
                                  g_fieldsCache.ContainsKey(referencedTable) ?
                                  g_fieldsCache[referencedTable][item.ReferenceField] :
                                  (from f in referencedTable.TableFields
                                   where f.Name.Equals(item.ReferenceField, StringComparison.OrdinalIgnoreCase)
                                   select f).FirstOrDefault();

                //determine field constraint
                if (item.ConstraintType == DbConstraintType.None)
                {
                    constraint = null;
                }
                else
                {
                    if (constraints.ContainsKey(item.ConstraintName))
                    {
                        constraint = constraints[item.ConstraintName];
                    }
                    else
                    {
                        constraints[item.ConstraintName] = constraint = new DbConstraintEntity(item.ConstraintName, table, item.ConstraintType, referencedTable);
                    }
                }

                //check field name
                if (fields.ContainsKey(item.Name))
                {
                    field = fields[item.Name];
                    if (field.ReferencedField == null)
                    {
                        field.ReferencedField = referencedField;
                    }
                }
                else
                {
                    fields[item.Name] = field = new DbTableFieldEntity(item.Name,
                                                                       item.Index,
                                                                       SqlServerUtility.GetRuntimeType(item.Type),
                                                                       SqlServerUtility.GetDbType(item.Type),
                                                                       (int)SqlServerUtility.GetSqlDbType(item.Type),
                                                                       item.Type,
                                                                       item.MaxLength,
                                                                       item.IsNullable,
                                                                       table,
                                                                       item.Description,
                                                                       item.HasDefault,
                                                                       item.IsIdentity,
                                                                       this.m_isReadOnlyCache.ContainsKey(item.Name.ToLower()) ?
                                                                       this.m_isReadOnlyCache[item.Name.ToLower()] :
                                                                       false,
                                                                       referencedField);
                }
                if (constraint != null)
                {
                    field.AddConstraints(constraint);
                    constraint.AddFields(field);
                }
            }
        }