EF的自定义实体命名规则

时间:2014-04-24 00:20:03

标签: .net entity-framework visual-studio

我的Visual Studio项目中有一个edmx文件,当您将模型中的表插入到edmx中时,它的名称与数据库中的名称相同,例如,通过导入myTable,您将得到一个名为myTable的实体,名称为myTables

在将表添加到我的文件中时,如何使表遵循自定义命名约定?因此,例如,添加myTable会导致名为tblmyTable的实体设置名称为tblmyTables

1 个答案:

答案 0 :(得分:6)

如果您使用的是旧实体对象生成器EF4.0或EF5.0:

您需要在多个位置修改 <YourModelName>.tt 文件。

模板调用container.BaseEntitySets.OfType<EntitySet>()以获取所有实体集,其中返回的EntityeSet.ElementTypeElementType的类型为EntityType)包含有关您的实体的信息。

这些对象在模板中的许多位置使用,因此最简单的解决方案是设置Name的{​​{1}}属性。但是EntityType属性是内部的,因此您需要使用refection来设置它。

因此,围绕第163行

找到模板中的以下行
Name

您需要在此处添加以下代码来设置region.Begin(CodeGenerationTools.GetResourceString("Template_RegionObjectSetProperties")); foreach (EntitySet set in container.BaseEntitySets.OfType<EntitySet>()) { 属性:

Name

可悲的是,你还没有完成,因为你仍然需要改变两个地方:

首先,生成的属性名称不固定,因此您需要在第173行周围找到以下行:

region.Begin(CodeGenerationTools.GetResourceString("Template_RegionObjectSetProperties"));
foreach (EntitySet set in container.BaseEntitySets.OfType<EntitySet>())
{
      set.ElementType.GetType()
            .GetProperty("Name", 
               BindingFlags.Instance | 
               BindingFlags.Public | 
               BindingFlags.NonPublic | 
               BindingFlags.SetProperty)
         .SetValue(set.ElementType, "tbl" + set.ElementType.Name, null);

并将其更改为(在<#=code.SpaceAfter(NewModifier(set))#><#=Accessibility.ForReadOnlyProperty(set)#> ObjectSet<<#=MultiSchemaEscape(set.ElementType, code)#>> <#=code.Escape(set)#> 之前添加tbl

<#=code.Escape(set)#>

由于反射黑客,您需要从生成的<#=code.SpaceAfter(NewModifier(set))#><#=Accessibility.ForReadOnlyProperty(set)#> ObjectSet<<#=MultiSchemaEscape(set.ElementType, code)#>> tbl<#=code.Escape(set)#> 中删除“tbl”前缀,因此您需要在第295行周围找到以下行:

EdmEntityTypeAttribute

并将其更改为:

[EdmEntityTypeAttribute(NamespaceName="<#=entity.NamespaceName#>", Name="<#=entity.Name#>")]

如果您使用默认的EF DbContext生成器EF5.0或EF6.0与edmx:

您需要修改[EdmEntityTypeAttribute(NamespaceName="<#=entity.NamespaceName#>", Name="<#=entity.Name.Replace("tbl","")#>")] 文件以应用自定义命名约定。

首先,您应该修改 tt 文件:

围绕第23行,您应该找到以下方法调用:

<YourEdmxName>.tt

此方法会对您的实体类进行创建,因此如果要修改生成的文件名,则需要将其更改为:

fileManager.StartNewFile(entity.Name + ".cs");

然后围绕第307行,您需要找到以下方法声明:

fileManager.StartNewFile("tbl" + entity.Name + ".cs");

此方法会编写您的类名,因此您需要更改它以应用您的约定:

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

最后,您需要修改 public string EntityClassOpening(EntityType entity) { return string.Format( CultureInfo.InvariantCulture, "{0} {1}partial class {2}{3}", Accessibility.ForType(entity), _code.SpaceAfter(_code.AbstractOption(entity)), "tbl" + _code.Escape(entity), // add tbl prefix before the entity name _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType))); }

围绕第296行,您需要找到以下写出<YourEdmxName>.Context.tt属性的方法:

DbSet

再次更改以应用您的约定:

public string DbSet(EntitySet entitySet)
{
    return string.Format(
        CultureInfo.InvariantCulture,
        "{0} DbSet<{1}> {2} {{ get; set; }}",
        Accessibility.ForReadOnlyProperty(entitySet),
        _typeMapper.GetTypeName(entitySet.ElementType),
        _code.Escape(entitySet));
}