【问题标题】:Entity Framework and database column names实体框架和数据库列名
【发布时间】:2012-08-09 06:11:09
【问题描述】:

我正在尝试修改 POCO T4 模板以包含数据库中与每个属性对应的列的名称。由于遗留原因,我们的数据库表是 8.3,我们的列最多 10 个字符,所以事情往往会被缩写。能够快速查找给定属性对应的列将是一个很大的帮助。

鉴于此,我不知道该怎么做。我对编辑 T4 模板的想法很满意,只是不知道如何从 EdmProperty 对象中检索列名。

谁能指出我正确的方向?

【问题讨论】:

  • 我假设 edmProperty.Name 不是你的意思。您需要基础列名称。

标签: c# entity-framework poco


【解决方案1】:

我已经在其他答案中讨论过这个问题,但我找不到它知道。问题是要获取此信息,您需要浏览映射的 MSL 部分 - 列映射到属性的部分。不幸的是,用于 MSL 元数据项的整个 API 是内部的(我认为未来 EF 版本的一个目标是使其公开)。当您拥有用于类生成的 T4 模板时,您通常使用 CSDL - 即实体描述,它仅包含您在 EDMX 图表和实体属性窗口中看到的信息。

【讨论】:

  • MetadataWorkspace 甚至都不可用?其他几个答案似乎表明它是,虽然我不知道如何在 T4 中得到它。
  • 它在 MetadataWorkspace 中可用,但对工作空间的查询会返回基本项目,您必须强制转换它们才能访问您正在查找的数据。 MSL 的问题在于您无法转换它,因为这些类型不是公共的 - 您必须使用反射来获取这些数据。
  • 我很高兴得到一个使用反射的答案,假设在评估 T4 时反射可用。
【解决方案2】:

我不会说这是解决此问题的最佳方法,但我就是这样做的。我需要能够以纯文本形式检索列名以绑定到 BoundField asp 控件,而这并未融入 EF 模板中。

所以,我添加了这段代码,它只加载“简单属性”,即:列名,以允许我这样做。它向名为“ColumnNames”的“表”对象添加了一个结构,并将列名公开为 const 字符串。

<#
    if (simpleProperties.Any())
    {
#>
    public struct ColumnName 
    {
  <# 
      foreach (var simpleProperty in simpleProperties)
      {
  #>
      public const string <#= simpleProperty #> = "<#= simpleProperty #>";
  <# 
      }
  #>
  }
<#  }
#>
}

我将它放在 T4 模板中的这段代码之前,该模板在解决方案中的 edmx 文件下生成单个文件:

<#
    EndNamespace(code);
}

这将创建如下所示的代码:

public partial class JobPosting
{
    public int PositionRowId { get; set; }
    public System.Guid PositionRelatedGuid { get; set; }

    public struct ColumnName 
    {
        public const string PositionRowId = "PositionRowId";
        public const string PositionRelatedGuid = "PositionRelatedGuid";
    }
}

我希望这会有所帮助。

【讨论】:

  • 我面前没有那个代码,但simpleProperties 不是根据edmx 文件为您提供名称吗?如果该列在数据库中称为 myColumnID,但为了 C# 的一致性,我在设计器中将其重命名为 MyColumnId,那么此处显示的是哪个名称?
  • 据我所知,我昨天学习了 EF,所以我可能错了,它是基于 edmx 文件的,所以如果你在设计器中重命名它,它会显示 edmx 名称,并且结果中不是数据库名称。
  • 我就是这么想的。这绝对是一个很好的解决方案,但是对于我遇到的另一个问题。我的问题特别是关于即使在重命名之后如何检索基础数据库名称。我非常相信这是不可能的,但我鼓励您在此处留下这个答案,以帮助其他发现此问题的人。
  • 我认为这有多大可能的问题在很大程度上取决于您的工作流程,但是如果我要费心(从现在开始)重命名来自数据库进入某种理智,然后我可能会手动为 JobPosting 创建另一个部分类,其中第二个公共结构映射到具有合理名称的第一个结构,并将第一个结构更改为私有可访问。所以我会有类似 JobPosting.PublicColumnName 的东西,它返回 JobPosting.PrivateColumnName 值,然后对应于数据库字段。
猜你喜欢
  • 1970-01-01
  • 2012-01-16
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2012-02-29
相关资源
最近更新 更多