/// <summary> /// 使用主键和外键对应构造一对多的关系。 /// </summary> /// <param name="thisType"></param> /// <param name="otherType"></param> /// <returns></returns> private static RelationshipMetadata MakeOne2ManyMetadata(Type thisType, Type otherType) { var pks = PropertyUnity.GetPrimaryProperties(thisType).ToList(); if (pks.Count > 0) { var fks = pks.Select(s => PropertyUnity.GetProperty(otherType, s.Name)).ToList(); var keys = new RelationshipKey[pks.Count]; for (var i = 0; i < pks.Count; i++) { if (fks[i] == null) { throw new Exception(); } keys[i] = new RelationshipKey { ThisKey = pks[i].Name, ThisProperty = pks[i], OtherKey = fks[i].Name, OtherProperty = fks[i] }; } return(new RelationshipMetadata(thisType, otherType, RelationshipStyle.One2Many, keys)); } return(null); }
/// <summary> /// 使用主键和外键对应构造一对多的关系。 /// </summary> /// <param name="relProperty"></param> /// <param name="thisType"></param> /// <param name="otherType"></param> /// <returns></returns> private static RelationshipMetadata MakeRelationshipMetadata(RelationProperty relProperty, Type thisType, Type otherType) { //是否使用了 ForeignKeyAttribute 来指定对应的外键 var assignAttr = relProperty.Info.ReflectionInfo.GetCustomAttributes <RelationshipAssignAttribute>().FirstOrDefault(); if (assignAttr != null) { var fkPro = PropertyUnity.GetProperty(otherType, assignAttr.ForeignKey); var pkPro = PropertyUnity.GetProperty(thisType, assignAttr.PrimaryKey); if (fkPro != null && pkPro != null) { var key = new RelationshipKey { ThisKey = pkPro.Name, ThisProperty = pkPro, OtherKey = fkPro.Name, OtherProperty = fkPro }; return(new RelationshipMetadata(thisType, otherType, RelationshipStyle.One2Many, RelationshipSource.AutomaticallyAssign, new[] { key })); } } //使用名称相同的主键进行匹配 var pks = PropertyUnity.GetPrimaryProperties(thisType).ToList(); if (pks.Count > 0) { var fks = pks.Select(s => PropertyUnity.GetProperty(otherType, s.Name)).ToList(); var keys = new RelationshipKey[pks.Count]; for (var i = 0; i < pks.Count; i++) { if (fks[i] == null) { throw new Exception(); } keys[i] = new RelationshipKey { ThisKey = pks[i].Name, ThisProperty = pks[i], OtherKey = fks[i].Name, OtherProperty = fks[i] }; } return(new RelationshipMetadata(thisType, otherType, RelationshipStyle.One2Many, RelationshipSource.AutomaticallyAssign, keys)); } return(null); }