在POCO Template t4生成器中查找属性是主键

时间:2012-12-27 23:34:22

标签: t4

我正在使用VS 2012附带的POCO t4模板生成器。我做了一些更改以包含Entity.Name,但我无法弄清楚主键。

public string EntityClassOpening(EntityType entity)
{
    return string.Format(
        CultureInfo.InvariantCulture,
        "{0} {1}partial class {2}{3}<{4},{5}>{6}",
        Accessibility.ForType(entity),
        _code.SpaceAfter(_code.AbstractOption(entity)),
        _code.Escape(entity),
        ": EntityBase",
        entity.Name,
        entity.Name,
        _code.StringBefore(" ", _typeMapper.GetTypeName(entity.BaseType)));
}

我找不到从EntityType对象层次结构中查找主键的方法。它暴露了属性,但该属性没有任何说法它是主键。

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:17)

万一有人试图在迁移RIA服务时尝试这样做,我在VS2013中使用标准的dbcontext模板,并在实体模板中添加了两个东西。

首先你需要:

using System.ComponentModel.DataAnnotations;

我把它放在靠近顶部的// ----块下面。

然后我修改了看起来像这样的代码。只需搜索名字。我的更改是ef.IsKey ...并添加了Key()属性。

    var simpleProperties = typeMapper.GetSimpleProperties(entity);
    if (simpleProperties.Any())
    {
        foreach (var edmProperty in simpleProperties)
        {
#>
 <#if (ef.IsKey(edmProperty))
   {#>      [Key()]
   <#}#>
    <#=codeStringGenerator.Property(edmProperty)#>
<#
        }
    }

答案 1 :(得分:9)

使用EntityType.KeyMembers属性获取主键包含的属性。

答案 2 :(得分:2)

我将其添加到TypeMapper部分,对结果感到满意:

public IEnumerable<EdmProperty> GetPrimaryKeyProperties(EntityType type)
{
    return type.KeyMembers.Select(s => (EdmProperty)s);
}