Exemplo n.º 1
0
        private void GenerateAssociation(DesignTimeMetadata metadata, IEntityType entityInfo, DbSetInfo dbSetInfo, INavigation childToParentNav)
        {
            INavigation inverseNavigation = childToParentNav.Inverse; //.FindInverse();
            string      assoc_name        = string.Format("{0}_{1}", inverseNavigation.Name, childToParentNav.Name);
            // Console.WriteLine($"Generate association: {assoc_name}");

            Association assoc = metadata.Associations.Where(a => a.name == assoc_name).FirstOrDefault();

            if (assoc == null)
            {
                IProperty[] principalProps = inverseNavigation.ForeignKey.PrincipalKey.Properties.ToArray();
                IProperty[] childProps     = childToParentNav.ForeignKey.Properties.ToArray();

                assoc = new Association
                {
                    name = assoc_name
                };
                IEntityType parentEntity = inverseNavigation.DeclaringEntityType;
                IEntityType childEntity  = childToParentNav.DeclaringEntityType;

                assoc.parentDbSetName   = parentEntity.ClrType.Name;
                assoc.childDbSetName    = childEntity.ClrType.Name;
                assoc.childToParentName = childToParentNav.Name;

                if (inverseNavigation != null)
                {
                    assoc.parentToChildrenName = inverseNavigation.Name;
                }

                int i = 0;
                foreach (IProperty pkProp in principalProps)
                {
                    FieldRel frel = new FieldRel
                    {
                        childField  = childProps?[i]?.Name,
                        parentField = pkProp.Name
                    };
                    assoc.fieldRels.Add(frel);
                    ++i;
                }

                metadata.Associations.Add(assoc);
            }
        }
Exemplo n.º 2
0
        protected override Metadata GetMetadata(bool isDraft)
        {
            Metadata metadata = new Metadata();

            var container     = this.DB.MetadataWorkspace.GetEntityContainer(this.DB.DefaultContainerName, DataSpace.CSpace);
            var entitySetsDic = (from meta in container.BaseEntitySets
                                 where meta.BuiltInTypeKind == BuiltInTypeKind.EntitySet
                                 select new { EntitySetName = meta.Name, EntityTypeName = meta.ElementType.Name }).ToDictionary(es => es.EntityTypeName);


            var CSpace         = this.DB.MetadataWorkspace.GetItemCollection(System.Data.Metadata.Edm.DataSpace.CSpace);
            var SSpace         = this.DB.MetadataWorkspace.GetItemCollection(System.Data.Metadata.Edm.DataSpace.SSpace);
            var entityEdmTypes = CSpace.GetItems <EntityType>().OrderBy(e => e.Name).ToArray();

            //var dbEntityEdmTypes = SSpace.GetItems<EntityType>().ToDictionary(r => r.Name);

            Array.ForEach(entityEdmTypes, (entityEdmType) =>
            {
                if (entityEdmType.Abstract)
                {
                    return;
                }
                string entityTypeName = entityEdmType.Name;
                string name           = entityTypeName;
                if (entityEdmType.BaseType != null)
                {
                    name = entityEdmType.BaseType.Name;
                }
                string entitySetName = entitySetsDic[name].EntitySetName;
                var keys             = entityEdmType.KeyMembers.Select(k => k.Name).ToArray();
                //string dbTableName = this.GetMappedEntitySetName(entitySetName);
                //var dbEntityEdm =  dbEntityEdmTypes[dbTableName];
                //Type entityType = this.GetEntityType(entitySetName);
                Type entityType     = this.GetEntityType2(entityTypeName);
                DbSetInfo dbSetInfo = new DbSetInfo()
                {
                    dbSetName  = entityTypeName,
                    EntityType = entityType
                };
                metadata.DbSets.Add(dbSetInfo);
                var edmProps = entityEdmType.Properties.ToArray();

                short pkNum = 0;
                Array.ForEach(edmProps, (edmProp) =>
                {
                    Field fieldInfo = new Field()
                    {
                        fieldName = edmProp.Name
                    };
                    if (keys.Contains(fieldInfo.fieldName))
                    {
                        ++pkNum;
                        fieldInfo.isPrimaryKey = pkNum;
                        fieldInfo.isReadOnly   = true;
                    }
                    bool isComputed           = this.isComputed(edmProp);
                    fieldInfo.isAutoGenerated = this.isAutoGenerated(edmProp);
                    fieldInfo.isNullable      = edmProp.Nullable;
                    fieldInfo.isReadOnly      = fieldInfo.isAutoGenerated;
                    bool isArray       = false;
                    string propType    = edmProp.TypeUsage.EdmType.Name;
                    fieldInfo.dataType = this.DataTypeFromType(propType, out isArray);
                    var facets         = edmProp.TypeUsage.Facets;
                    var maxLenFacet    = facets.Where(f => f.Name == "MaxLength").FirstOrDefault();
                    if (maxLenFacet != null)
                    {
                        try
                        {
                            fieldInfo.maxLength = (short)Convert.ChangeType(maxLenFacet.Value, typeof(short));
                        }
                        catch
                        {
                        }
                    }
                    //gess that the property is rowversion
                    fieldInfo.fieldType = (isComputed && fieldInfo.dataType == DataType.Binary) ? FieldType.RowTimeStamp : FieldType.None;
                    dbSetInfo.fieldInfos.Add(fieldInfo);
                });
            });

            var associations = CSpace.GetItems <AssociationType>().Where(a => a.IsForeignKey).OrderBy(e => e.Name);

            Func <EdmType, string> fn_name = (EdmType n) =>
            {
                if (n.FullName.Contains('['))
                {
                    Regex  regex = new Regex(".*?\\[(.*?)\\].*?");
                    Match  match = regex.Match(n.FullName);
                    string table = match.Groups[1].Value;
                    return(table);
                }
                else
                {
                    return(n.FullName);
                }
            };

            foreach (AssociationType asstype in associations)
            {
                var endMembers = asstype.RelationshipEndMembers;

                foreach (ReferentialConstraint constraint in asstype.ReferentialConstraints)
                {
                    try
                    {
                        Association ass = metadata.Associations.Where(a => a.name == constraint.ToString()).FirstOrDefault();

                        if (ass == null)
                        {
                            var    parentEnd        = (constraint.FromRole.RelationshipMultiplicity == RelationshipMultiplicity.One || constraint.FromRole.RelationshipMultiplicity == RelationshipMultiplicity.ZeroOrOne) ? constraint.FromRole : constraint.ToRole;
                            var    childEnd         = constraint.FromRole == parentEnd ? constraint.ToRole : constraint.FromRole;
                            var    parent           = parentEnd.TypeUsage.EdmType;
                            var    child            = childEnd.TypeUsage.EdmType;
                            string parentName       = fn_name(parent);
                            string childName        = fn_name(child);
                            var    parentEntity     = entityEdmTypes.Where(en => parentName == en.FullName).First();
                            var    childEntity      = entityEdmTypes.Where(en => childName == en.FullName).First();
                            var    parentToChildren = parentEntity.NavigationProperties.Where(np => np.FromEndMember.Name == parentEnd.Name && np.ToEndMember.Name == childEnd.Name).FirstOrDefault();
                            var    childToParent    = childEntity.NavigationProperties.Where(np => np.FromEndMember.Name == childEnd.Name && np.ToEndMember.Name == parentEnd.Name).FirstOrDefault();

                            ass      = new Association();
                            ass.name = constraint.ToString();
                            metadata.Associations.Add(ass);
                            ass.parentDbSetName      = parentEntity.Name;
                            ass.childDbSetName       = childEntity.Name;
                            ass.parentToChildrenName = parentToChildren == null ? "" : parentToChildren.Name;
                            ass.childToParentName    = childToParent == null ? "" : childToParent.Name;

                            var parentArr = constraint.FromRole == parentEnd?constraint.FromProperties.ToArray() : constraint.ToProperties.ToArray();

                            var childArr = constraint.FromRole == parentEnd?constraint.ToProperties.ToArray() : constraint.FromProperties.ToArray();

                            for (int i = 0; i < parentArr.Length; ++i)
                            {
                                FieldRel frel = null;
                                frel = ass.fieldRels.Where(fr => fr.parentField == parentArr[i].Name && fr.childField == childArr[i].Name).FirstOrDefault();
                                if (frel == null)
                                {
                                    frel = new FieldRel();
                                    ass.fieldRels.Add(frel);
                                    frel.parentField = parentArr[i].Name;
                                    frel.childField  = childArr[i].Name;
                                }
                            }
                        }
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }
            }
            return(metadata);
        }
Exemplo n.º 3
0
        protected override Metadata GetMetadata(bool isDraft)
        {
            Metadata metadata = new Metadata();

            var container     = this.ObjectContext.MetadataWorkspace.GetEntityContainer(this.ObjectContext.DefaultContainerName, DataSpace.CSpace);
            var entitySetsDic = (from meta in container.BaseEntitySets
                                 where meta.BuiltInTypeKind == BuiltInTypeKind.EntitySet
                                 select new { EntitySetName = meta.Name, EntityTypeName = meta.ElementType.Name }).ToDictionary(es => es.EntityTypeName);


            var CSpace          = this.ObjectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSpace);
            var SSpace          = this.ObjectContext.MetadataWorkspace.GetItemCollection(DataSpace.SSpace);
            var entityEdmTypes  = CSpace.GetItems <EntityType>().OrderBy(e => e.Name).ToArray();
            var complexEdmTypes = CSpace.GetItems <ComplexType>().OrderBy(e => e.Name).ToArray();

            Array.ForEach(complexEdmTypes, (entityEdmType) =>
            {
                string entityTypeName = entityEdmType.Name;
                string name           = entityTypeName;
                var keys            = entityEdmType.Members.Select(m => m.Name).Take(1).ToArray();
                Type entityType     = this.GetEntityType2(entityTypeName);
                DbSetInfo dbSetInfo = new DbSetInfo()
                {
                    dbSetName  = entityTypeName,
                    EntityType = entityType
                };
                metadata.DbSets.Add(dbSetInfo);
                var edmProps = entityEdmType.Properties.ToArray();
                this.GenerateFieldInfos(dbSetInfo, keys, edmProps);
            });

            Array.ForEach(entityEdmTypes, (entityEdmType) =>
            {
                if (entityEdmType.Abstract)
                {
                    return;
                }
                string entityTypeName = entityEdmType.Name;
                string name           = entityTypeName;
                if (entityEdmType.BaseType != null)
                {
                    name = entityEdmType.BaseType.Name;
                }
                var keys = entityEdmType.KeyMembers.Select(k => k.Name).ToArray();
                //var dbEntityEdm =  dbEntityEdmTypes[dbTableName];
                //Type entityType = this.GetEntityType(entitySetName);
                //string entitySetName = entitySetsDic[name].EntitySetName;

                Type entityType     = this.GetEntityType2(entityTypeName);
                DbSetInfo dbSetInfo = new DbSetInfo()
                {
                    dbSetName = entityTypeName, EntityType = entityType
                };
                metadata.DbSets.Add(dbSetInfo);
                var edmProps = entityEdmType.Properties.ToArray();
                this.GenerateFieldInfos(dbSetInfo, keys, edmProps);
            });

            var associations = CSpace.GetItems <AssociationType>().Where(a => a.IsForeignKey).OrderBy(e => e.Name);

            Func <EdmType, string> fn_name = (EdmType n) =>
            {
                if (n.FullName.Contains('['))
                {
                    Regex  regex = new Regex(".*?\\[(.*?)\\].*?");
                    Match  match = regex.Match(n.FullName);
                    string table = match.Groups[1].Value;
                    return(table);
                }
                else
                {
                    return(n.FullName);
                }
            };

            foreach (AssociationType asstype in associations)
            {
                var endMembers = asstype.RelationshipEndMembers;

                foreach (ReferentialConstraint constraint in asstype.ReferentialConstraints)
                {
                    try
                    {
                        Association ass = metadata.Associations.Where(a => a.name == constraint.ToString()).FirstOrDefault();

                        if (ass == null)
                        {
                            var    parentEnd        = (constraint.FromRole.RelationshipMultiplicity == RelationshipMultiplicity.One || constraint.FromRole.RelationshipMultiplicity == RelationshipMultiplicity.ZeroOrOne) ? constraint.FromRole : constraint.ToRole;
                            var    childEnd         = constraint.FromRole == parentEnd ? constraint.ToRole : constraint.FromRole;
                            var    parent           = parentEnd.TypeUsage.EdmType;
                            var    child            = childEnd.TypeUsage.EdmType;
                            string parentName       = fn_name(parent);
                            string childName        = fn_name(child);
                            var    parentEntity     = entityEdmTypes.Where(en => parentName == en.FullName).First();
                            var    childEntity      = entityEdmTypes.Where(en => childName == en.FullName).First();
                            var    parentToChildren = parentEntity.NavigationProperties.Where(np => np.FromEndMember.Name == parentEnd.Name && np.ToEndMember.Name == childEnd.Name).FirstOrDefault();
                            var    childToParent    = childEntity.NavigationProperties.Where(np => np.FromEndMember.Name == childEnd.Name && np.ToEndMember.Name == parentEnd.Name).FirstOrDefault();

                            ass      = new Association();
                            ass.name = constraint.ToString();
                            metadata.Associations.Add(ass);
                            ass.parentDbSetName      = parentEntity.Name;
                            ass.childDbSetName       = childEntity.Name;
                            ass.parentToChildrenName = parentToChildren == null ? "" : parentToChildren.Name;
                            ass.childToParentName    = childToParent == null ? "" : childToParent.Name;

                            var parentArr = constraint.FromRole == parentEnd?constraint.FromProperties.ToArray() : constraint.ToProperties.ToArray();

                            var childArr = constraint.FromRole == parentEnd?constraint.ToProperties.ToArray() : constraint.FromProperties.ToArray();

                            for (int i = 0; i < parentArr.Length; ++i)
                            {
                                FieldRel frel = null;
                                frel = ass.fieldRels.Where(fr => fr.parentField == parentArr[i].Name && fr.childField == childArr[i].Name).FirstOrDefault();
                                if (frel == null)
                                {
                                    frel = new FieldRel();
                                    ass.fieldRels.Add(frel);
                                    frel.parentField = parentArr[i].Name;
                                    frel.childField  = childArr[i].Name;
                                }
                            }
                        }
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }
            }
            return(metadata);
        }
Exemplo n.º 4
0
        protected override Metadata GetMetadata()
        {
            Metadata metadata = new Metadata();

            PropertyInfo[] dbsetPropList = this.DB.GetType().GetProperties().Where(p => p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(System.Data.Linq.Table <>)).ToArray();
            Array.ForEach(dbsetPropList, (propInfo) =>
            {
                Type entityType     = propInfo.PropertyType.GetGenericArguments().First();
                DbSetInfo dbSetInfo = new DbSetInfo()
                {
                    dbSetName = entityType.Name, EntityType = entityType, insertDataMethod = "Insert{0}", updateDataMethod = "Update{0}", deleteDataMethod = "Delete{0}", refreshDataMethod = "", validateDataMethod = ""
                };
                metadata.DbSets.Add(dbSetInfo);
                PropertyInfo[] fieldPropList = entityType.GetProperties().Where(p => p.IsDefined(typeof(System.Data.Linq.Mapping.ColumnAttribute), false)).ToArray();
                short pkNum = 0;
                Array.ForEach(fieldPropList, (propInfo2) =>
                {
                    FieldInfo fieldInfo       = new FieldInfo();
                    fieldInfo.fieldName       = propInfo2.Name;
                    var colAttr               = (System.Data.Linq.Mapping.ColumnAttribute)propInfo2.GetCustomAttributes(typeof(System.Data.Linq.Mapping.ColumnAttribute), false).First();
                    fieldInfo.isAutoGenerated = colAttr.IsDbGenerated;
                    if (colAttr.IsPrimaryKey)
                    {
                        fieldInfo.isPrimaryKey = ++pkNum;
                    }
                    bool isArray             = false;
                    fieldInfo.dataType       = this.DataHelper.DataTypeFromType(propInfo2.PropertyType, out isArray);
                    fieldInfo.isNullable     = this.DataHelper.IsNullableType(propInfo2.PropertyType) || colAttr.CanBeNull;
                    fieldInfo.isRowTimeStamp = colAttr.IsVersion;
                    fieldInfo.isReadOnly     = !propInfo2.CanWrite;
                    dbSetInfo.fieldInfos.Add(fieldInfo);
                });

                PropertyInfo[] navPropList = entityType.GetProperties().Where(p => p.IsDefined(typeof(System.Data.Linq.Mapping.AssociationAttribute), false)).ToArray();
                Array.ForEach(navPropList, (propInfo3) =>
                {
                    var attr = (System.Data.Linq.Mapping.AssociationAttribute)propInfo3.GetCustomAttributes(typeof(System.Data.Linq.Mapping.AssociationAttribute), false).First();

                    Association ass = metadata.Associations.Where(a => a.name == attr.Name).FirstOrDefault();
                    if (ass == null)
                    {
                        ass      = new Association();
                        ass.name = attr.Name;
                        metadata.Associations.Add(ass);
                    }
                    FieldRel frel;
                    if (propInfo3.PropertyType.IsGenericType && propInfo3.PropertyType.GetGenericTypeDefinition() == typeof(System.Data.Linq.EntitySet <>))
                    {
                        frel = ass.fieldRels.Where(f => f.childField == attr.OtherKey && f.parentField == attr.ThisKey).FirstOrDefault();
                        if (frel == null)
                        {
                            frel = new FieldRel();
                            ass.fieldRels.Add(frel);
                        }
                        Type entityType3         = propInfo3.PropertyType.GetGenericArguments().First();
                        ass.childDbSetName       = entityType3.Name;
                        ass.parentToChildrenName = propInfo3.Name;
                        frel.childField          = attr.OtherKey;
                        frel.parentField         = attr.ThisKey;
                    }
                    else
                    {
                        frel = ass.fieldRels.Where(f => f.childField == attr.ThisKey && f.parentField == attr.OtherKey).FirstOrDefault();
                        if (frel == null)
                        {
                            frel = new FieldRel();
                            ass.fieldRels.Add(frel);
                        }
                        ass.parentDbSetName   = propInfo3.PropertyType.Name;
                        ass.childToParentName = propInfo3.Name;
                        frel.childField       = attr.ThisKey;
                        frel.parentField      = attr.OtherKey;
                    }
                });
            });

            return(metadata);
        }
Exemplo n.º 5
0
        protected override Metadata GetMetadata(bool isDraft)
        {
            Metadata metadata = new Metadata();

            PropertyInfo[] dbsetPropList = this.DB.GetType().GetProperties().Where(p => p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(System.Data.Linq.Table <>)).ToArray();
            Array.ForEach(dbsetPropList, (propInfo) =>
            {
                Type entityType     = propInfo.PropertyType.GetGenericArguments().First();
                DbSetInfo dbSetInfo = new DbSetInfo()
                {
                    dbSetName  = entityType.Name,
                    EntityType = entityType
                };
                metadata.DbSets.Add(dbSetInfo);
                PropertyInfo[] fieldPropList = entityType.GetProperties().Where(p => p.IsDefined(typeof(System.Data.Linq.Mapping.ColumnAttribute), false)).ToArray();
                short pkNum = 0;
                Array.ForEach(fieldPropList, (propInfo2) =>
                {
                    Field fieldInfo           = new Field();
                    fieldInfo.fieldName       = propInfo2.Name;
                    var colAttr               = (System.Data.Linq.Mapping.ColumnAttribute)propInfo2.GetCustomAttributes(typeof(System.Data.Linq.Mapping.ColumnAttribute), false).First();
                    fieldInfo.isAutoGenerated = colAttr.IsDbGenerated;
                    if (colAttr.IsPrimaryKey)
                    {
                        fieldInfo.isPrimaryKey = ++pkNum;
                    }
                    if (!string.IsNullOrWhiteSpace(colAttr.DbType) && colAttr.DbType.IndexOf("Char(", StringComparison.OrdinalIgnoreCase) >= 0)
                    {
                        string len    = System.Text.RegularExpressions.Regex.Match(colAttr.DbType, @"\(([^)]*)\)").Groups[1].Value;
                        int maxLength = -1;
                        if (int.TryParse(len, out maxLength))
                        {
                            fieldInfo.maxLength = (short)maxLength;
                        }
                    }
                    bool isArray       = false;
                    fieldInfo.dataType = this.ServiceContainer.ValueConverter.DataTypeFromType(propInfo2.PropertyType, out isArray);
                    if (colAttr.DbType.IndexOf("NOT NULL", StringComparison.OrdinalIgnoreCase) > 0)
                    {
                        fieldInfo.isNullable = false;
                    }
                    fieldInfo.fieldType  = colAttr.IsVersion?FieldType.RowTimeStamp: FieldType.None;
                    fieldInfo.isReadOnly = !propInfo2.CanWrite;
                    dbSetInfo.fieldInfos.Add(fieldInfo);
                });

                PropertyInfo[] navPropList = entityType.GetProperties().Where(p => p.IsDefined(typeof(System.Data.Linq.Mapping.AssociationAttribute), false)).ToArray();
                Array.ForEach(navPropList, (propInfo3) =>
                {
                    var attr = (System.Data.Linq.Mapping.AssociationAttribute)propInfo3.GetCustomAttributes(typeof(System.Data.Linq.Mapping.AssociationAttribute), false).First();

                    Association ass = metadata.Associations.Where(a => a.name == attr.Name).FirstOrDefault();
                    if (ass == null)
                    {
                        ass      = new Association();
                        ass.name = attr.Name;
                        metadata.Associations.Add(ass);
                    }
                    FieldRel frel;
                    if (propInfo3.PropertyType.IsGenericType && propInfo3.PropertyType.GetGenericTypeDefinition() == typeof(System.Data.Linq.EntitySet <>))
                    {
                        frel = ass.fieldRels.Where(f => f.childField == attr.OtherKey && f.parentField == attr.ThisKey).FirstOrDefault();
                        if (frel == null)
                        {
                            frel = new FieldRel();
                            ass.fieldRels.Add(frel);
                        }
                        Type entityType3         = propInfo3.PropertyType.GetGenericArguments().First();
                        ass.childDbSetName       = entityType3.Name;
                        ass.parentToChildrenName = propInfo3.Name;
                        frel.childField          = attr.OtherKey;
                        frel.parentField         = attr.ThisKey;
                    }
                    else
                    {
                        frel = ass.fieldRels.Where(f => f.childField == attr.ThisKey && f.parentField == attr.OtherKey).FirstOrDefault();
                        if (frel == null)
                        {
                            frel = new FieldRel();
                            ass.fieldRels.Add(frel);
                        }
                        ass.parentDbSetName   = propInfo3.PropertyType.Name;
                        ass.childToParentName = propInfo3.Name;
                        frel.childField       = attr.ThisKey;
                        frel.parentField      = attr.OtherKey;
                    }
                });
            });

            return(metadata);
        }
Exemplo n.º 6
0
        protected override Metadata GetMetadata(bool isDraft)
        {
            var metadata   = new Metadata();
            var dbSetProps =
                typeof(TDB).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
                .Where(
                    p =>
                    p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet <>));
            var dbSetTypes = dbSetProps.Select(p => p.PropertyType.GetGenericArguments().First()).ToArray();


            Array.ForEach(dbSetTypes, dbSetType =>
            {
                var entityTypeName = dbSetType.Name;
                var name           = entityTypeName;
                var fieldsProps    =
                    dbSetType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
                    .Where(
                        p =>
                        !(p.PropertyType.IsGenericType &&
                          p.PropertyType.GetGenericTypeDefinition() == typeof(ICollection <>)))
                    .ToArray();
                var keys     = new string[0];
                var keyProps = fieldsProps.Where(p => p.GetCustomAttributes <KeyAttribute>().Any()).ToArray();
                if (keyProps.Length > 0)
                {
                    var keyProps2 =
                        fieldsProps.Where(p => p.GetCustomAttributes <KeyAttribute>().Any())
                        .Select(
                            p => new { p.Name, corder = p.GetCustomAttributes <ColumnAttribute>().FirstOrDefault() })
                        .OrderBy(p => p.corder == null ? p.Name : p.corder.Order.ToString().PadLeft(4, '0'))
                        .ToArray();
                    keys = keyProps2.Select(p => p.Name).ToArray();
                }
                else
                {
                    keyProps =
                        fieldsProps.Where(
                            p =>
                            p.Name.EndsWith("ID", StringComparison.OrdinalIgnoreCase) &&
                            !p.Name.EndsWith("guid", StringComparison.OrdinalIgnoreCase)).ToArray();
                    keys = keyProps.Select(p => p.Name).ToArray();
                }
                var entityType = dbSetType;
                var dbSetInfo  = new DbSetInfo
                {
                    dbSetName  = entityTypeName,
                    EntityType = entityType
                };
                metadata.DbSets.Add(dbSetInfo);
                GenerateFieldInfos(metadata, dbSetTypes, dbSetInfo, keys, fieldsProps);
            });

            metadata.Associations.ForEach(assoc =>
            {
                var parentDB = metadata.DbSets.Where(d => d.dbSetName == assoc.parentDbSetName).FirstOrDefault();
                var childDB  = metadata.DbSets.Where(d => d.dbSetName == assoc.childDbSetName).FirstOrDefault();
                var pkFields = parentDB.GetPKFields();
                foreach (var pkfield in pkFields)
                {
                    var fld =
                        childDB.fieldInfos.Where(f => f.fieldName == pkfield.fieldName && f.dataType == pkfield.dataType)
                        .FirstOrDefault();
                    if (fld != null)
                    {
                        var frel         = new FieldRel();
                        frel.childField  = fld.fieldName;
                        frel.parentField = pkfield.fieldName;
                        assoc.fieldRels.Add(frel);
                    }
                }
            });

            return(metadata);
        }
Exemplo n.º 7
0
        public static DesignTimeMetadata FromXML(string xml)
        {
            DesignTimeMetadata metadata  = new DesignTimeMetadata();
            XDocument          xdoc      = XDocument.Parse(xml);
            XElement           xmetadata = xdoc.Element(NS_DATA + "Metadata");
            XElement           xdbSets   = xmetadata.Element(NS_DATA + "Metadata.DbSets");
            IEnumerable <XProcessingInstruction> ximports = xmetadata.Nodes().Where(n => n is XProcessingInstruction && (n as XProcessingInstruction).Target == "import").Cast <XProcessingInstruction>();

            foreach (XProcessingInstruction xpc in ximports)
            {
                metadata.TypeScriptImports.Add(xpc.Data);
            }

            if (xdbSets != null)
            {
                foreach (XElement xdbSet in xdbSets.Elements(NS_DATA + "DbSetInfo"))
                {
                    string xType       = xdbSet.Attribute("EntityType").Value;
                    Type   _entityType = _GetTypeFromXType(xType, xdoc);

                    DbSetInfo dbSetInfo = new DbSetInfo
                    {
                        dbSetName = (string)xdbSet.Attribute("dbSetName")
                    };
                    dbSetInfo.SetEntityType(_entityType);

                    if (xdbSet.Attributes("enablePaging").Any())
                    {
                        dbSetInfo.enablePaging = (bool)xdbSet.Attribute("enablePaging");
                    }

                    if (xdbSet.Attributes("pageSize").Any())
                    {
                        dbSetInfo.pageSize = (int)xdbSet.Attribute("pageSize");
                    }

                    if (xdbSet.Attributes("isTrackChanges").Any())
                    {
                        dbSetInfo.SetIsTrackChanges((bool)xdbSet.Attribute("isTrackChanges"));
                    }

                    metadata.DbSets.Add(dbSetInfo);

                    XElement xFields = xdbSet.Element(NS_DATA + "DbSetInfo.fieldInfos");
                    IEnumerable <XElement> fields = xFields.Elements(NS_DATA + "Field");
                    dbSetInfo.fieldInfos.AddRange(_XElementsToFieldList(fields));
                }
            }

            XElement xAssocs = xmetadata.Element(NS_DATA + "Metadata.Associations");

            if (xAssocs != null)
            {
                foreach (XElement xAssoc in xAssocs.Elements(NS_DATA + "Association"))
                {
                    Association assoc = new Association
                    {
                        name = (string)xAssoc.Attribute("name")
                    };
                    if (xAssoc.Attributes("parentDbSetName").Any())
                    {
                        assoc.parentDbSetName = (string)xAssoc.Attribute("parentDbSetName");
                    }

                    if (xAssoc.Attributes("childDbSetName").Any())
                    {
                        assoc.childDbSetName = (string)xAssoc.Attribute("childDbSetName");
                    }

                    if (xAssoc.Attributes("childToParentName").Any())
                    {
                        assoc.childToParentName = (string)xAssoc.Attribute("childToParentName");
                    }

                    if (xAssoc.Attributes("parentToChildrenName").Any())
                    {
                        assoc.parentToChildrenName = (string)xAssoc.Attribute("parentToChildrenName");
                    }

                    if (xAssoc.Attributes("onDeleteAction").Any())
                    {
                        assoc.onDeleteAction =
                            (DeleteAction)Enum.Parse(typeof(DeleteAction), xAssoc.Attribute("onDeleteAction").Value);
                    }

                    XElement xFieldRels = xAssoc.Element(NS_DATA + "Association.fieldRels");
                    if (xFieldRels != null)
                    {
                        foreach (XElement xFieldRel in xFieldRels.Elements(NS_DATA + "FieldRel"))
                        {
                            FieldRel fldRel = new FieldRel
                            {
                                parentField = (string)xFieldRel.Attribute("parentField"),
                                childField  = (string)xFieldRel.Attribute("childField")
                            };
                            assoc.fieldRels.Add(fldRel);
                        }
                    }

                    metadata.Associations.Add(assoc);
                }
            }

            return(metadata);
        }