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); }
/// <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); } } }