【问题标题】:How can I detect relations between the tables in my UML?如何检测 UML 中表之间的关系?
【发布时间】:2026-02-10 23:25:05
【问题描述】:

我正在使用 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();
        }
    }
}

我打算使用最后两个“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>
...

问题是,我如何检测关系?我想我必须遍历数据资源并检查(也许?)导航属性,但我看不出如何。

有人可以帮忙吗?有什么想法吗?

谢谢,恰帕

【问题讨论】:

  • 您的数据库是否包含可以使用的外键约束? w3schools.com/sql/sql_foreignkey.asp 否则,PK 和 FK 的命名方式是否可以匹配?
  • 这个程序接收 UML 模型并将其转换为 MVC 架构中的 C# 类和数据模型,因此,我没有关系、PK、FK 或其他任何东西。我设法创建了所有控制器、视图和模型,但我需要 edmx。
  • 如果您的 UML 模型不包含此信息,或者不包含可以从中派生关系的信息,我看不出它是如何完成的。大概 edmx 代表一个实际的数据库;您是否还创建了数据库,还是已经存在?
  • 收到的 UML 模型包含类图。从中我生成 C# 类和所有其他的东西
  • 如果我错了,请纠正我,但我认为这个问题的原始标题会吸引更多潜在的帮助者,因为他们会确切地看到问题所在。检测数据库中的关系可能非常广泛,因为数据库几乎存在于所有类型的编程中。我说的对吗?

标签: c# .net visual-studio-2012 edmx ado.net-entity-data-model


【解决方案1】:

我设法通过这种方式检测到关系:

        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 领域模型的所有关系,然后检查关系类型是否是三者之一(聚合、关联或组合)。如果是,则关系存在,我可以使用关联的角色和类。

谢谢

【讨论】: