diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Column.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Column.cs index 0aedf464b3..14b228357d 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Column.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Column.cs @@ -64,15 +64,16 @@ namespace ICSharpCode.Data.Core.DatabaseObjects else allowsNull = "not null"; - if (_parentTable != null && _parentTable.Constraints != null) - { - IConstraint constraint = _parentTable.Constraints.FirstOrDefault(constr => constr.FKColumnName == Name); - - if (constraint != null) - return string.Format("{0} (FK, {1}, {2})", Name, DataType, allowsNull); - } - - return string.Format("{0} ({1}, {2})", Name, DataType, allowsNull); + bool isForeignKey = IsForeignKey; + + if (IsPrimaryKey && !isForeignKey) + return string.Format("{0} (PK, {1}, {2})", Name, DataType, allowsNull); + else if (!IsPrimaryKey && isForeignKey) + return string.Format("{0} (FK, {1}, {2})", Name, DataType, allowsNull); + else if (IsPrimaryKey && isForeignKey) + return string.Format("{0} (PK, FK, {1}, {2})", Name, DataType, allowsNull); + else + return string.Format("{0} ({1}, {2})", Name, DataType, allowsNull); } } @@ -190,7 +191,7 @@ namespace ICSharpCode.Data.Core.DatabaseObjects { get { - IConstraint constraint = _parentTable.Constraints.FirstOrDefault(constr => constr.FKColumnName == Name); + IConstraint constraint = _parentTable.Constraints.FirstOrDefault(constr => constr.FKColumns.FirstOrDefault(column => column.ColumnId == ColumnId && column.Name == Name) != null); if (constraint == null) return false; @@ -269,6 +270,17 @@ namespace ICSharpCode.Data.Core.DatabaseObjects } } + public bool IsUserDefinedDataType + { + get + { + if (string.IsNullOrEmpty(_systemType)) + return false; + else + return true; + } + } + public bool IsXmlIndexable { get { return _isXmlIndexable; } diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Constraint.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Constraint.cs index 0da7f5265d..837aedfaa8 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Constraint.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Constraint.cs @@ -15,22 +15,22 @@ namespace ICSharpCode.Data.Core.DatabaseObjects { #region Fields - private string _pkColumnName = string.Empty; + private List _pkColumnNames = new List(); private string _pkTableName = string.Empty; - private string _fkColumnName = string.Empty; + private List _fkColumnNames = new List(); private string _fkTableName = string.Empty; #endregion #region Properties - public string PKColumnName + public List PKColumnNames { - get { return _pkColumnName; } + get { return _pkColumnNames; } set { - _pkColumnName = value; - OnPropertyChanged("PKColumnName"); + _pkColumnNames = value; + OnPropertyChanged("PKColumnNames"); } } @@ -44,13 +44,13 @@ namespace ICSharpCode.Data.Core.DatabaseObjects } } - public string FKColumnName + public List FKColumnNames { - get { return _fkColumnName; } + get { return _fkColumnNames; } set { - _fkColumnName = value; - OnPropertyChanged("FKColumnName"); + _fkColumnNames = value; + OnPropertyChanged("FKColumnNames"); } } @@ -64,14 +64,14 @@ namespace ICSharpCode.Data.Core.DatabaseObjects } } - public IColumn PKColumn + public DatabaseObjectsCollection PKColumns { get { ITable table = PKTable; if (table != null) - return GetColumnFromTableByName(table, PKColumnName); + return GetColumnsFromTableByName(table, PKColumnNames); else return null; } @@ -86,25 +86,27 @@ namespace ICSharpCode.Data.Core.DatabaseObjects { get { - if (!FKColumn.IsPrimaryKey && FKColumn.IsNullable) + IColumn fkColumn = FKColumns.First(); + + if (!fkColumn.IsPrimaryKey && fkColumn.IsNullable) return Cardinality.ZeroToOne; - else if (!FKColumn.IsPrimaryKey && !FKColumn.IsNullable) + else if (!fkColumn.IsPrimaryKey && !fkColumn.IsNullable) return Cardinality.One; - else if (!FKColumn.IsPrimaryKey) + else if (!fkColumn.IsPrimaryKey) return Cardinality.Many; else return Cardinality.One; } } - public IColumn FKColumn + public DatabaseObjectsCollection FKColumns { get { ITable table = FKTable; if (table != null) - return GetColumnFromTableByName(table, FKColumnName); + return GetColumnsFromTableByName(table, FKColumnNames); else return null; } @@ -119,12 +121,16 @@ namespace ICSharpCode.Data.Core.DatabaseObjects { get { - if (PKColumn.IsPrimaryKey) - return Cardinality.Many; - else if (!PKColumn.IsPrimaryKey && !FKColumn.IsNullable) + IColumn pkColumn = PKColumns.First(); + + if (!pkColumn.IsPrimaryKey && !FKColumns.First().IsNullable) return Cardinality.One; - else // !PKColumn.IsPrimaryKey && FKColumn.IsNullable - return Cardinality.ZeroToOne; + if (pkColumn.IsPrimaryKey && pkColumn.IsForeignKey) + return Cardinality.One; + if (pkColumn.IsPrimaryKey) + return Cardinality.Many; + + return Cardinality.ZeroToOne; } } @@ -149,9 +155,9 @@ namespace ICSharpCode.Data.Core.DatabaseObjects return null; } - private IColumn GetColumnFromTableByName(ITable table, string columnName) - { - return table.Items.FirstOrDefault(c => c.Name == columnName); + private DatabaseObjectsCollection GetColumnsFromTableByName(ITable table, List columnNames) + { + return table.Items.Where(c => columnNames.Contains(c.Name)).ToDatabaseObjectsCollection(); } #endregion diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Database.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Database.cs index 1faa62b9a0..477f9d8662 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Database.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/DatabaseObjects/Database.cs @@ -23,7 +23,6 @@ namespace ICSharpCode.Data.Core.DatabaseObjects private DatabaseObjectBase _views = null; private DatabaseObjectBase _procedures = null; private DatabaseObjectBase _constraints = null; - private DatabaseObjectBase _userDefinedDataTypes = null; #endregion @@ -83,17 +82,6 @@ namespace ICSharpCode.Data.Core.DatabaseObjects } } - public DatabaseObjectsCollection UserDefinedDataTypes - { - get - { - if (_userDefinedDataTypes != null) - return _userDefinedDataTypes.Items; - else - return null; - } - } - #endregion #region Constructor @@ -114,9 +102,6 @@ namespace ICSharpCode.Data.Core.DatabaseObjects _constraints = new DatabaseObjectBase(); _constraints.Name = "Constraints"; - _userDefinedDataTypes = new DatabaseObjectBase(); - _userDefinedDataTypes.Name = "UserDefinedDataTypes"; - _tables = new DatabaseObjectBase(); _tables.Name = "Tables"; _tables.Items = Datasource.DatabaseDriver.LoadTables(this); diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/ICSharpCode.Data.Core.csproj b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/ICSharpCode.Data.Core.csproj index 9566fc780a..90b3716651 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/ICSharpCode.Data.Core.csproj +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/ICSharpCode.Data.Core.csproj @@ -83,7 +83,6 @@ - @@ -98,7 +97,6 @@ - diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IColumn.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IColumn.cs index 4d51469220..970dc076db 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IColumn.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IColumn.cs @@ -1,8 +1,12 @@ -using System; +#region Usings + +using System; using System.Collections.Generic; using System.Linq; using System.Text; +#endregion + namespace ICSharpCode.Data.Core.Interfaces { public interface IColumn : IDatabaseObjectBase @@ -16,6 +20,7 @@ namespace ICSharpCode.Data.Core.Interfaces bool IsComputed { get; set; } bool IsCursorType { get; set; } bool IsDeterministic { get; set; } + bool IsForeignKey { get; } bool IsFulltextIndexed { get; set; } bool IsIdentity { get; set; } bool IsIdNotForRepl { get; set; } @@ -25,6 +30,7 @@ namespace ICSharpCode.Data.Core.Interfaces bool IsPrecise { get; set; } bool IsPrimaryKey { get; set; } bool IsRowGuidCol { get; set; } + bool IsUserDefinedDataType { get; } bool IsSystemVerified { get; set; } bool IsXmlIndexable { get; set; } int Precision { get; set; } diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IConstraint.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IConstraint.cs index 97142200f3..2844287987 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IConstraint.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IConstraint.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using ICSharpCode.Data.Core.Enums; +using ICSharpCode.Data.Core.DatabaseObjects; #endregion @@ -12,13 +13,13 @@ namespace ICSharpCode.Data.Core.Interfaces { public interface IConstraint : IDatabaseObjectBase { - string PKColumnName { get; set; } + List PKColumnNames { get; set; } string PKTableName { get; set; } - string FKColumnName { get; set; } + List FKColumnNames { get; set; } string FKTableName { get; set; } - IColumn PKColumn { get; } + DatabaseObjectsCollection PKColumns { get; } ITable PKTable { get; } - IColumn FKColumn { get; } + DatabaseObjectsCollection FKColumns { get; } ITable FKTable { get; } Cardinality PKCardinality { get; } Cardinality FKCardinality { get; } diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IDatabase.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IDatabase.cs index 99d311eccd..d4ced2d00d 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IDatabase.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core/Interfaces/IDatabase.cs @@ -19,7 +19,6 @@ namespace ICSharpCode.Data.Core.Interfaces DatabaseObjectsCollection Views { get; } DatabaseObjectsCollection Procedures { get; } DatabaseObjectsCollection Constraints { get; } - DatabaseObjectsCollection UserDefinedDataTypes { get; } bool LoadDatabase(); } diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs index d69232dfcb..784750c21f 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs @@ -107,6 +107,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding if (wizard.DialogResult == true) _edmView = new EDMView(wizard.EDMXDocument, readMoreAction); + else + return; } // Load or generate DesignerView and EntityTypeDesigners diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Common/EventedObservableCollection.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Common/EventedObservableCollection.cs index 1092c5327f..17d7976d78 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Common/EventedObservableCollection.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Common/EventedObservableCollection.cs @@ -3,6 +3,7 @@ using System; using System.Collections.ObjectModel; using System.Collections.Specialized; +using System.Collections.Generic; #endregion @@ -52,4 +53,21 @@ namespace ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common #endregion } + + public static class EventedObservableCollection + { + #region Extension methods + + public static EventedObservableCollection ToEventedObservableCollection(this IEnumerable source) + { + EventedObservableCollection dest = new EventedObservableCollection(); + + foreach (T item in source) + dest.Add(item); + + return dest; + } + + #endregion + } } diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/SSDL/Association/Role.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/SSDL/Association/Role.cs index ea62a68449..7909c74848 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/SSDL/Association/Role.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/SSDL/Association/Role.cs @@ -15,6 +15,11 @@ namespace ICSharpCode.Data.EDMDesigner.Core.EDMObjects.SSDL.Association { public EntityType.EntityType Type { get; set; } public Cardinality Cardinality { get; set; } - public Property.Property Property { get; set; } + public EventedObservableCollection Properties { get; set; } + + public Role() + { + Properties = new EventedObservableCollection(); + } } } diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs index 06599e343a..9f3b93c286 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs @@ -123,17 +123,22 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO new XElement(ssdlNamespace + "End", new XAttribute("Role", association.Role1.Name), new XAttribute("Type", string.Concat(entityContainerNamespace, association.Role1.Type.Name)), new XAttribute("Multiplicity", CardinalityStringConverter.CardinalityToSTring(association.Role1.Cardinality))), new XElement(ssdlNamespace + "End", new XAttribute("Role", role2Name), new XAttribute("Type", string.Concat(entityContainerNamespace, association.Role2.Type.Name)), new XAttribute("Multiplicity", CardinalityStringConverter.CardinalityToSTring(association.Role2.Cardinality)))); - string dependantRoleName = association.DependantRole.Name; + string dependentRoleName = association.DependantRole.Name; // If the assocation end properties are the same properties if (association.PrincipalRole.Name == association.DependantRole.Name && association.PrincipalRole.Type.Name == association.DependantRole.Type.Name) - dependantRoleName += "1"; + dependentRoleName += "1"; - associationElement.Add(new XElement(ssdlNamespace + "ReferentialConstraint", - new XElement(ssdlNamespace + "Principal", new XAttribute("Role", association.PrincipalRole.Name), - new XElement(ssdlNamespace + "PropertyRef", new XAttribute("Name", association.PrincipalRole.Property.Name))), - new XElement(ssdlNamespace + "Dependent", new XAttribute("Role", dependantRoleName), - new XElement(ssdlNamespace + "PropertyRef", new XAttribute("Name", association.DependantRole.Property.Name))))); + XElement principalRoleElement = new XElement(ssdlNamespace + "Principal", new XAttribute("Role", association.PrincipalRole.Name)); + foreach (Property property in association.PrincipalRole.Properties) + principalRoleElement.Add(new XElement(ssdlNamespace + "PropertyRef", new XAttribute("Name", property.Name))); + + XElement dependentRoleElement = new XElement(ssdlNamespace + "Dependent", new XAttribute("Role", dependentRoleName)); + foreach (Property property in association.DependantRole.Properties) + dependentRoleElement.Add(new XElement(ssdlNamespace + "PropertyRef", new XAttribute("Name", property.Name))); + + XElement referentialConstraintElement = new XElement(ssdlNamespace + "ReferentialConstraint", principalRoleElement, dependentRoleElement); + associationElement.Add(referentialConstraintElement); schema.Add(associationElement); } @@ -250,13 +255,13 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO { isPrincipal = true; association.PrincipalRole = role; - role.Property = role.Type.Properties.Where(p => p.Name == principalElement.Element(XName.Get("PropertyRef", ssdlNamespace.NamespaceName)).Attribute("Name").Value).First(); + role.Properties = role.Type.Properties.Where(p => p.Name == principalElement.Element(XName.Get("PropertyRef", ssdlNamespace.NamespaceName)).Attribute("Name").Value).ToEventedObservableCollection(); } else { isPrincipal = false; association.DependantRole = role; - role.Property = role.Type.Properties.Where(p => p.Name == referentialConstraintElement.Element(XName.Get("Dependent", ssdlNamespace.NamespaceName)).Element(XName.Get("PropertyRef", ssdlNamespace.NamespaceName)).Attribute("Name").Value).First(); + role.Properties = role.Type.Properties.Where(p => p.Name == referentialConstraintElement.Element(XName.Get("Dependent", ssdlNamespace.NamespaceName)).Element(XName.Get("PropertyRef", ssdlNamespace.NamespaceName)).Attribute("Name").Value).ToEventedObservableCollection(); } } if (isPrincipal) diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/EDMConverter.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/EDMConverter.cs index 0212d54cb0..0961600e86 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/EDMConverter.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/EDMConverter.cs @@ -56,15 +56,16 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters filenameRump, objectContextName, objectContextNamespace); processStartInfo.UseShellExecute = false; processStartInfo.ErrorDialog = false; + processStartInfo.RedirectStandardOutput = true; processStartInfo.RedirectStandardError = true; process.StartInfo = processStartInfo; process.Start(); + string outputMessage = process.StandardOutput.ReadToEnd(); process.WaitForExit(); if (process.ExitCode != 0) { - TextReader textReader = process.StandardError; - throw new Exception("An error occured during generating the EDMX file.", new Exception(textReader.ReadToEnd())); + throw new Exception("An error occured during generating the EDMX file.", new Exception(outputMessage)); } XDocument csdlXDocument = XDocument.Load(filenameRump + ".csdl"); diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/SSDLConverter.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/SSDLConverter.cs index 1b29a47a90..064f146460 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/SSDLConverter.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/SSDLConverter.cs @@ -127,15 +127,19 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters Property property = new Property(entityType) { Name = column.Name, - Type = column.DataType, IsKey = column.IsPrimaryKey, - Nullable = column.IsNullable, + Nullable = column.IsNullable // FixedLength // Collation // DefaultValue // Unicode }; + if (!column.IsUserDefinedDataType) + property.Type = column.DataType; + else + property.Type = column.SystemType; + if (column.Length > 0) property.MaxLength = column.Length; @@ -167,9 +171,12 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters Cardinality = (Cardinality)constraint.PKCardinality }; - Property role1Property = CreateSSDLProperty(constraint.PKColumn, CreateSSDLEntityType(constraint.PKTable)); - role1.Property = role1Property; - role1.Type = role1Property.EntityType; + foreach (IColumn pkColumn in constraint.PKColumns) + { + Property role1Property = CreateSSDLProperty(pkColumn, CreateSSDLEntityType(constraint.PKTable)); + role1.Properties.Add(role1Property); + role1.Type = role1Property.EntityType; + } association.Role1 = role1; association.PrincipalRole = role1; @@ -178,11 +185,14 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters { Name = constraint.FKTableName, Cardinality = (Cardinality)constraint.FKCardinality - }; + }; - Property role2Property = CreateSSDLProperty(constraint.FKColumn, CreateSSDLEntityType(constraint.FKTable)); - role2.Property = role2Property; - role2.Type = role2Property.EntityType; + foreach (IColumn fkColumn in constraint.FKColumns) + { + Property role2Property = CreateSSDLProperty(fkColumn, CreateSSDLEntityType(constraint.FKTable)); + role2.Properties.Add(role2Property); + role2.Type = role2Property.EntityType; + } association.Role2 = role2; association.DependantRole = role2; diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.SQLServer/SQLServerDatabaseDriver.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.SQLServer/SQLServerDatabaseDriver.cs index 8b3c259c30..a0fbc6f329 100644 --- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.SQLServer/SQLServerDatabaseDriver.cs +++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.SQLServer/SQLServerDatabaseDriver.cs @@ -107,7 +107,6 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer ORDER BY 1,2,3,4"; - private const string _getUserDefinedDataTypes = @"SELECT t1.*, t2.Name AS SystemType FROM sys.Types t1, sys.types t2 WHERE t1.is_user_defined = 1 AND t2.system_type_id = t1.system_type_id AND t2.user_type_id = t1.system_type_id"; private const string _getViews = @"SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='VIEW' AND TABLE_NAME<>'dtproperties' ORDER BY TABLE_SCHEMA, TABLE_NAME"; private const string _getProcedures = "SELECT ROUTINE_NAME, ROUTINE_SCHEMA, ROUTINE_BODY, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE'"; private const string _getProcedureParameters = @"SELECT PARAMETER_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, PARAMETER_MODE, IS_RESULT FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = '{0}' AND SPECIFIC_SCHEMA = '{1}' AND SPECIFIC_CATALOG = '{2}'"; @@ -228,6 +227,7 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer column.ColumnId = (int)dtColumns.Rows[j]["ColumnId"]; column.Name = (string)dtColumns.Rows[j]["Name"]; column.DataType = (string)dtColumns.Rows[j]["DataType"]; + column.SystemType = (string)dtColumns.Rows[j]["SystemType"]; column.Length = Convert.ToInt32(dtColumns.Rows[j]["Length"]); if (column.Length == -1) @@ -241,6 +241,16 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer default: break; } + + switch (column.SystemType.ToLower()) + { + case "varchar": + case "nvarchar": + column.SystemType += "(max)"; + break; + default: + break; + } } column.Precision = Convert.ToInt32(dtColumns.Rows[j]["NumericPrecision"]); @@ -267,33 +277,23 @@ namespace ICSharpCode.Data.Core.DatabaseDrivers.SQLServer for (int i = 0; i < dtConstraints.Rows.Count; i++) { - IConstraint constraint = new ICSharpCode.Data.Core.DatabaseObjects.Constraint(); - constraint.Name = (string)dtConstraints.Rows[i]["ConstraintName"]; - constraint.FKTableName = (string)dtConstraints.Rows[i]["FKTable"]; - constraint.FKColumnName = (string)dtConstraints.Rows[i]["FKColumn"]; - constraint.PKTableName = (string)dtConstraints.Rows[i]["PKTable"]; - constraint.PKColumnName = (string)dtConstraints.Rows[i]["PKColumn"]; - - database.Constraints.Add(constraint); - } - } + string constraintName = (string)dtConstraints.Rows[i]["ConstraintName"]; - using (SqlDataAdapter da = new SqlDataAdapter(_getUserDefinedDataTypes, sqlConnection)) - { - DataTable dtUserDefinedDataTypes = new DataTable("UserDefinedDataTypes"); - da.Fill(dtUserDefinedDataTypes); + IConstraint constraint = database.Constraints.FirstOrDefault(c => c.Name == constraintName); - for (int i = 0; i < dtUserDefinedDataTypes.Rows.Count; i++) - { - IUserDefinedDataType userDefinedDataType = new UserDefinedDataType(); - userDefinedDataType.Name = (string)dtUserDefinedDataTypes.Rows[i]["Name"]; - userDefinedDataType.SystemType = (string)dtUserDefinedDataTypes.Rows[i]["SystemType"]; - userDefinedDataType.Length = Convert.ToInt32(dtUserDefinedDataTypes.Rows[i]["Max_Length"]); - userDefinedDataType.IsNullable = (bool)dtUserDefinedDataTypes.Rows[i]["Is_Nullable"]; + if (constraint == null) + { + constraint = new ICSharpCode.Data.Core.DatabaseObjects.Constraint(); + constraint.Name = constraintName; + constraint.FKTableName = (string)dtConstraints.Rows[i]["FKTable"]; + constraint.PKTableName = (string)dtConstraints.Rows[i]["PKTable"]; - database.UserDefinedDataTypes.Add(userDefinedDataType); - } + database.Constraints.Add(constraint); + } + constraint.FKColumnNames.Add((string)dtConstraints.Rows[i]["FKColumn"]); + constraint.PKColumnNames.Add((string)dtConstraints.Rows[i]["PKColumn"]); + } } using (SqlDataAdapter da = new SqlDataAdapter(_getTables, sqlConnection))