0

Visual Studio 2012 を使用して C# でアプリケーションを開発しています。このアプリケーションは、とりわけ、汎用データ モデル、*.edmx ファイルを生成する必要があります。このプログラムは UML モデルを受け取り、それを MVC アーキテクチャの C# クラスとデータ モデルに変換するため、テーブル間の関係、PK、FK を取得していません。

私の問題は、テーブル間の関係を生成することです (ナビゲーション プロパティ?)。各データ リソース (テーブル) について、外部キーがあるかどうかを確認し、ある場合は、正しいコードを生成して edmx ファイルを正しく作成する必要があります。ここに私がこれまでに持っているものがあります:

私の edmxCodeGen クラス:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataComponent;

namespace codeGenAppMM2XulRdf
{
    public class edmxCodeGen
    {
        public static string toCS(AppDataModel appRDF)
        {
            StringBuilder csResult = new StringBuilder();

            csResult.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
            csResult.AppendLine("<edmx:Edmx Version=\"3.0\" xmlns:edmx=\"http://schemas.microsoft.com/ado/2009/11/edmx\">");
            csResult.AppendLine("<!-- EF Runtime content -->");
            csResult.AppendLine("<edmx:Runtime>");
            csResult.AppendLine("<!-- SSDL content -->");
            csResult.AppendLine("<edmx:StorageModels>");

            csResult.AppendLine("  <Schema Namespace=\"BDClinicModel.Store\" Alias=\"Self\" Provider=\"System.Data.SqlClient\" ProviderManifestToken=\"2005\" xmlns:store=\"http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator\" xmlns=\"http://schemas.microsoft.com/ado/2009/11/edm/ssdl\">");
            csResult.AppendLine("    <EntityContainer Name=\"BDClinicModelStoreContainer\">");
            // ver namespace e container name nas duas linhas acima

            foreach (DataResource dr in appRDF.dataResources)
            {
                csResult.AppendLine("      <EntitySet Name=" + dr.ResourceClassName + " EntityType=\"BDClinicModel.Store." + dr.ResourceClassName + " store:Type=\"Tables\" Schema=\"dbo\" />");

            }

            csResult.AppendLine("      <EntitySet Name=\"sysdiagrams\" EntityType=\"BDClinicModel.Store.sysdiagrams\" store:Type=\"Tables\" Schema=\"dbo\" />");
            // sysdiagrams

            foreach (DataResource dr in appRDF.dataResources)
            {
                foreach (NavigationProperty np in dr.NavigationAttrs)
                {


                }
            }
            csResult.AppendLine("");
            csResult.AppendLine("");
            csResult.AppendLine("");
            csResult.AppendLine("");

            return csResult.ToString();
        }
    }
}

最後の 2 つの「foreach」サイクルを使用して、不足しているものを次のように記述します (データベースをインポートし、そこから edmx が自動的に生成された他の例から):

  <AssociationSet Name="FK__consulta__id_mar__3493CFA7" Association="BDClinicModel.Store.FK__consulta__id_mar__3493CFA7">
    <End Role="marcacao" EntitySet="marcacao" />
    <End Role="consulta" EntitySet="consulta" />
  </AssociationSet>
  <AssociationSet Name="FK__consulta__id_pro__3587F3E0" Association="BDClinicModel.Store.FK__consulta__id_pro__3587F3E0">
    <End Role="processo" EntitySet="processo" />
    <End Role="consulta" EntitySet="consulta" />
  </AssociationSet>
...

問題は、関係をどのように検出するかです。データ リソースを反復処理して、ナビゲーション プロパティを確認する必要があると思いますが、その方法がわかりません。

誰か助けてくれませんか?何か案は?

ありがとう、チアパ

4

1 に答える 1

0

私はこの方法で関係を検出することができました:

        foreach (UMLRelationship rel in umlDomainModel.UMLClassRelationships)
        {
            if (rel.relType == Enum_TypeOfRelation.aggregation || rel.relType == Enum_TypeOfRelation.association || rel.relType == Enum_TypeOfRelation.composition)
            { 
                csResult.AppendLine("");
...

このようにして、UML ドメイン モデルのすべての関係を繰り返し処理し、後で関係タイプが 3 つ (集約、関連付け、構成) のいずれかであるかどうかを確認します。そうであれば、関係が存在し、関連付けられたロールとクラスを使用できます。

ありがとう

于 2013-07-10T09:19:30.480 に答える