2012-08-13 152 views
5

我试图修改一个POCO T4模板,以在与每个属性对应的数据库中包含该列的名称。出于传统原因,我们的数据库表格是8.3,而我们的列是最多10个字符,所以事情往往会变得枯燥。能够快速查找给定属性对应的列将会很有帮助。实体框架和数据库列名

鉴于这一点,我不知道如何去做这件事。我很熟悉编辑T4模板的想法,我只是不知道如何从EdmProperty对象中检索列名。

任何人都可以指向正确的方向吗?

+0

我假设edmProperty.Name不是你的意思。您需要底层的列名称。 – Maarten 2012-08-13 06:15:31

+0

@Maarten - 正确。 – Bobson 2012-08-13 11:20:47

回答

1

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

+0

它在MetadataWorkspace中甚至不可用?其他几个答案似乎表明它是这样的,尽管我无法弄清楚如何在T4中实现它。 – Bobson 2012-08-13 12:00:30

+0

它在MetadataWorkspace中可用,但在工作空间上的查询返回基本项目,您必须投它们才能访问您正在查找的数据。 MSL的问题是你不能投射它,因为这些类型不是公开的 - 你必须使用反射来获取这些数据。 – 2012-08-13 13:00:08

+0

我会很高兴与使用反射的答案,假设评估T4时反射是可用的。 – Bobson 2012-08-13 19:59:02

0

我不会说这是解决这个问题的最好方法,但这是我做到的。我需要能够以纯文本的方式检索列名,以绑定到BoundField asp控件,并且不会将其烘焙到EF模板中。

所以,我添加了这一点代码,它只是加载“简单的属性”,即:列名,让我这样做。它将一个结构添加到名为“ColumnNames”的“表”对象,并将列名作为常量字符串公开。

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

我把这个在溶液中生成EDMX文件下的单个文件的T4模板此位的代码之前:

<# 
    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"; 
    } 
} 

我希望这会有所帮助。

+0

我没有在我面前的代码,但不'simpleProperties'给你基于'edmx'文件的名称?如果该列在数据库中被称为“myColumnID”,但为了C#一致性,我已将其在设计器中重命名为“MyColumnId”,这个名称显示在这里? – Bobson 2014-06-17 16:53:10

+0

据我所知,昨天我学习了EF,所以我可能错了,它是基于edmx文件的,所以如果你在设计器中重命名它,那么它会显示在edmx名称中,而不是数据库名称结果。 – 2014-06-17 16:56:20

+1

这就是我的想法。这绝对是一个很好的解决方案,但是我遇到了另一个问题。我的问题是关于如何在重命名后重新获取底层数据库名称。我几乎相信这是不可能的,但我鼓励你在这里留下这个答案来帮助任何发现这个问题的人。 – Bobson 2014-06-17 16:59:01