protected virtual void OnPupulateM2MRelations() { var relationDescType = new CodeTypeReference(typeof(RelationDescEx)); #region Relation foreach (var relation in _entity.GetM2MRelations(false)) { if (relation.Left.Entity == relation.Right.Entity) { throw new ArgumentException("To realize m2m relation on self use SelfRelation instead."); } LinkTarget link = relation.Left.Entity == _entity ? relation.Right : relation.Left; var accessorName = link.AccessorName; var relatedEntity = link.Entity; if (string.IsNullOrEmpty(accessorName)) { // существуют похожие релейшены, но не имеющие имени акссесора var lst = link.Entity.GetM2MRelations(false).FindAll( r => r.Left != link && r.Right != link && ((r.Left.Entity == _entity && string.IsNullOrEmpty(r.Right.AccessorName)) || (r.Right.Entity == _entity && string.IsNullOrEmpty(r.Left.AccessorName)))); if (lst.Count > 0) { throw new WXMLException( string.Format( "Существуют неоднозначные связи между '{0}' и '{1}'. конкретизируйте их через accessorName.", lst[0].Left.Entity.Name, lst[0].Right.Entity.Name)); } accessorName = relatedEntity.Name; } accessorName = WXMLCodeDomGeneratorNameHelper.GetMultipleForm(accessorName); var entityTypeExpression = Settings.UseTypeInProps ? WXMLCodeDomGeneratorHelper.GetEntityClassTypeReferenceExpression(_settings, relatedEntity, relatedEntity.Namespace != _entity.Namespace) : WXMLCodeDomGeneratorHelper.GetEntityNameReferenceExpression(_settings, relatedEntity, relatedEntity.Namespace != _entity.Namespace); var desc = new CodeObjectCreateExpression( new CodeTypeReference(typeof(M2MRelationDesc)), entityTypeExpression); var staticProperty = new CodeMemberProperty { Name = accessorName + "Relation", HasGet = true, HasSet = false, Attributes = MemberAttributes.Public | MemberAttributes.Final | MemberAttributes.Static, Type = relationDescType }; staticProperty.GetStatements.Add(new CodeMethodReturnStatement( new CodeObjectCreateExpression(typeof(RelationDescEx), new CodeObjectCreateExpression(typeof(EntityUnion), WXMLCodeDomGeneratorHelper.GetEntityNameReferenceExpression(_settings, _entity, false) ), desc) )); desc.Parameters.Add(new CodePrimitiveExpression(relation.SourceFragment.Identifier)); Members.Add(staticProperty); GetRelationMethods(relation.SourceFragment.Identifier, staticProperty.Name); var memberProperty = new CodeMemberProperty { Name = accessorName, HasGet = true, HasSet = false, Attributes = MemberAttributes.Public | MemberAttributes.Final, Type = new CodeTypeReference(typeof(RelationCmd)) }; if (!string.IsNullOrEmpty(link.AccessorDescription)) { WXMLCodeDomGenerator.SetMemberDescription(memberProperty, link.AccessorDescription); } memberProperty.GetStatements.Add( new CodeMethodReturnStatement( new CodeMethodInvokeExpression( new CodeThisReferenceExpression(), "GetCmd", new CodePropertyReferenceExpression( new CodePropertyReferenceExpression( null, //WXMLCodeDomGeneratorHelper.GetEntityClassReferenceExpression(_settings, _entity, false), staticProperty.Name ), "M2MRel" ) ) ) ); Members.Add(memberProperty); _gen.RaisePropertyCreated(null, this, memberProperty, null); } #endregion #region SelfRelation foreach (var relation in _entity.GetM2MSelfRelations(false)) { var accessorName = relation.Direct.AccessorName; if (!string.IsNullOrEmpty(accessorName)) { var entityTypeExpression = Settings.UseTypeInProps ? WXMLCodeDomGeneratorHelper.GetEntityClassTypeReferenceExpression(_settings, _entity, false) : WXMLCodeDomGeneratorHelper.GetEntityNameReferenceExpression(_settings, _entity, false); var desc = new CodeObjectCreateExpression( new CodeTypeReference(typeof(M2MRelationDesc)), entityTypeExpression); accessorName = WXMLCodeDomGeneratorNameHelper.GetMultipleForm(accessorName); var staticProperty = new CodeMemberProperty { Name = accessorName + "Relation", HasGet = true, HasSet = false, Attributes = MemberAttributes.Public | MemberAttributes.Final | MemberAttributes.Static, Type = relationDescType }; staticProperty.GetStatements.Add(new CodeMethodReturnStatement( new CodeObjectCreateExpression(typeof(RelationDescEx), new CodeObjectCreateExpression(typeof(EntityUnion), WXMLCodeDomGeneratorHelper.GetEntityNameReferenceExpression(_settings, _entity, false) ), desc) )); GetRelationMethods(relation.SourceFragment.Identifier, staticProperty.Name); //desc.Parameters.Add(new CodePrimitiveExpression(relation.Direct.FieldName)); //desc.Parameters.Add(new CodeFieldReferenceExpression( // new CodeTypeReferenceExpression(typeof(M2MRelationDesc)),"DirKey") //); desc.Parameters.Add(new CodePrimitiveExpression(relation.SourceFragment.Identifier)); Members.Add(staticProperty); var memberProperty = new CodeMemberProperty { Name = accessorName, HasGet = true, HasSet = false, Attributes = MemberAttributes.Public | MemberAttributes.Final, Type = new CodeTypeReference(typeof(RelationCmd)) }; if (!string.IsNullOrEmpty(relation.Direct.AccessorDescription)) { WXMLCodeDomGenerator.SetMemberDescription(memberProperty, relation.Direct.AccessorDescription); } memberProperty.GetStatements.Add( new CodeMethodReturnStatement( new CodeMethodInvokeExpression( new CodeThisReferenceExpression(), "GetCmd", new CodePropertyReferenceExpression( new CodePropertyReferenceExpression( null, //WXMLCodeDomGeneratorHelper.GetEntityClassReferenceExpression(_settings, _entity, false), staticProperty.Name ), "M2MRel" ) ) ) ); Members.Add(memberProperty); _gen.RaisePropertyCreated(null, this, memberProperty, null); } accessorName = relation.Reverse.AccessorName; if (!string.IsNullOrEmpty(accessorName)) { var entityTypeExpression = WXMLCodeDomGeneratorHelper.GetEntityNameReferenceExpression(_settings, _entity, false); var desc = new CodeObjectCreateExpression( new CodeTypeReference(typeof(M2MRelationDesc)), entityTypeExpression); accessorName = WXMLCodeDomGeneratorNameHelper.GetMultipleForm(accessorName); var staticProperty = new CodeMemberProperty { Name = accessorName + "Relation", HasGet = true, HasSet = false, Attributes = MemberAttributes.Public | MemberAttributes.Final | MemberAttributes.Static, Type = relationDescType }; staticProperty.GetStatements.Add(new CodeMethodReturnStatement( new CodeObjectCreateExpression(typeof(RelationDescEx), new CodeObjectCreateExpression(typeof(EntityUnion), WXMLCodeDomGeneratorHelper.GetEntityNameReferenceExpression(_settings, _entity, false) ), desc) )); //desc.Parameters.Add(new CodePrimitiveExpression(relation.Reverse.FieldName)); //desc.Parameters.Add(new CodeFieldReferenceExpression( // new CodeTypeReferenceExpression(typeof(M2MRelationDesc)),"RevKey") //); desc.Parameters.Add(new CodePrimitiveExpression(M2MRelationDesc.ReversePrefix + relation.SourceFragment.Identifier)); GetRelationMethods(relation.SourceFragment.Identifier, staticProperty.Name); Members.Add(staticProperty); var memberProperty = new CodeMemberProperty { Name = accessorName, HasGet = true, HasSet = false, Attributes = MemberAttributes.Public | MemberAttributes.Final, Type = new CodeTypeReference(typeof(RelationCmd)) }; if (!string.IsNullOrEmpty(relation.Reverse.AccessorDescription)) { WXMLCodeDomGenerator.SetMemberDescription(memberProperty, relation.Reverse.AccessorDescription); } memberProperty.GetStatements.Add( new CodeMethodReturnStatement( new CodeMethodInvokeExpression( new CodeThisReferenceExpression(), "GetCmd", new CodePropertyReferenceExpression( new CodePropertyReferenceExpression( null, //WXMLCodeDomGeneratorHelper.GetEntityClassReferenceExpression(_settings, _entity, false), staticProperty.Name ), "M2MRel" ) ) ) ); Members.Add(memberProperty); _gen.RaisePropertyCreated(null, this, memberProperty, null); } } #endregion }