如何从T4模板(tt)文件中检查身份列?

3
如果数据库列是主键且不是自增的,我想在我的类属性中添加以下属性。请考虑以下代码。
[Key, Column(Order =  0), DatabaseGenerated (DatabaseGeneratedOption.None )]
public virtual int TypeId
{ get; set; }

我使用了以下代码来检查主键。
bool isPrimaryKey = ef.IsKey(edmProperty);
#>
<#
if (isPrimaryKey)
{
#>
[Key]
<#
}
#>

现在我需要一些代码来检查是否为标识列?如果不是,则我将从我的 T4 模板代码中添加以下属性
DatabaseGenerated (DatabaseGeneratedOption.None )。 我正在使用EF 4.x POCO Entity Generator for C#生成我的 poco 类。现在我想要进行修改。 现在我该怎么做?等待您的帮助。
2个回答

0
public const string annotationNamespace = "http://schemas.microsoft.com/ado/2009/02/edm/annotation";

MetadataProperty storeGeneratedPatternProperty = null;
edmProperty.MetadataProperties.TryGetValue(annotationNamespace + ":StoreGeneratedPattern", false, out storeGeneratedPatternProperty);
bool IsIdentity = storeGeneratedPatternProperty != null && storeGeneratedPatternProperty.Value.ToString() == "Identity";

尝试在我的自定义t4脚手架中使您的代码片段正常工作... 我正在考虑向CustomTemplates/MvcView/ModelMetadataFunctions.cs.include.t4添加一个函数。错误消息告诉我.MetadataProperties在不同的命名空间中,因此我将System.Data.Metadata.Edm添加到'using'文件中,但是我不确定接下来该怎么做 - 我从ModelProperty的实例开始 - 这是PropertyMetadata类型,但我认为您的edmProperty必须是其他东西。 - bkwdesign
edmXXX 是关于 EntityFramework 的,根据您的评论,我不太明白您的情况(我相信是关于 MVC 视图脚手架),与此有何关系。在我的示例中,您必须在输入中拥有 edm 元数据。 - avestnik
你说得对。我最终搞清楚了我的问题。就像你所说,我正在进行一些MVC脚手架工作,并且基本上通过在此线程中发布评论来搞错了。我们应该清理一下我们的评论并将它们删除吗? - bkwdesign
由你决定。我认为无论是保留还是删除都没有问题。 - avestnik

0
如果您使用 tblWidget 和 WidgetId 作为主键的命名约定,那么您可以使用它来检测它是否为主键。

感谢您的回复。我可以轻松地识别主键。我只需要确定列“Idendity”(自动增量)是否是主键。由于我正在进行棕色领域项目,因此无法使用命名约定。 - Hasibul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接