实体框架和数据库列名
我试图修改一个POCO T4模板,以在与每个属性对应的数据库中包含该列的名称。出于传统原因,我们的数据库表格是8.3,而我们的列是最多10个字符,所以事情往往会变得枯燥。能够快速查找给定属性对应的列将会很有帮助。实体框架和数据库列名
鉴于这一点,我不知道如何去做这件事。我很熟悉编辑T4模板的想法,我只是不知道如何从EdmProperty对象中检索列名。
任何人都可以指向正确的方向吗?
我已经在其他答案中讨论过这个问题,但是我找不到它。问题是,要获取这些信息,您需要浏览映射的MSL部分 - 列映射到属性的部分。不幸的是,MSL元数据项目的整个API都是内部的(我认为未来EF发行版的一个目标是公开)。当你有用于类生成的T4模板时,你通常使用CSDL--这是实体描述,它只包含你在EDMX图和实体属性窗口中看到的信息。
我不会说这是解决这个问题的最好方法,但这是我做到的。我需要能够以纯文本的方式检索列名,以绑定到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";
}
}
我希望这会有所帮助。
我没有在我面前的代码,但不'simpleProperties'给你基于'edmx'文件的名称?如果该列在数据库中被称为“myColumnID”,但为了C#一致性,我已将其在设计器中重命名为“MyColumnId”,这个名称显示在这里? – Bobson 2014-06-17 16:53:10
据我所知,昨天我学习了EF,所以我可能错了,它是基于edmx文件的,所以如果你在设计器中重命名它,那么它会显示在edmx名称中,而不是数据库名称结果。 – 2014-06-17 16:56:20
这就是我的想法。这绝对是一个很好的解决方案,但是我遇到了另一个问题。我的问题是关于如何在重命名后重新获取底层数据库名称。我几乎相信这是不可能的,但我鼓励你在这里留下这个答案来帮助任何发现这个问题的人。 – Bobson 2014-06-17 16:59:01
我假设edmProperty.Name不是你的意思。您需要底层的列名称。 – Maarten 2012-08-13 06:15:31
@Maarten - 正确。 – Bobson 2012-08-13 11:20:47