如果您使用的是旧的实体对象生成器 EF4.0 或 EF5.0:
需要多处修改<YourModelName>.tt文件。
模板调用container.BaseEntitySets.OfType<EntitySet>() 来获取您的所有实体集,其中返回的EntityeSet.ElementType(其中ElementType 的类型为EntityType)包含有关您的实体的信息。
这些对象在模板中的许多地方使用,因此最简单的解决方案是设置EntityType 的Name 属性。但是Name 属性是内部的,因此您需要使用反射来设置它。
因此,在模板中的 第 163 行附近找到以下行:
region.Begin(CodeGenerationTools.GetResourceString("Template_RegionObjectSetProperties"));
foreach (EntitySet set in container.BaseEntitySets.OfType<EntitySet>())
{
您需要在此处添加以下代码来设置Name 属性:
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);
遗憾的是你还没有完成,因为你还需要改变两个地方:
首先生成的属性名称不固定,因此您需要在 line 173 周围找到以下行:
<#=code.SpaceAfter(NewModifier(set))#><#=Accessibility.ForReadOnlyProperty(set)#> ObjectSet<<#=MultiSchemaEscape(set.ElementType, code)#>> <#=code.Escape(set)#>
并将其更改为(在<#=code.Escape(set)#> 之前添加tbl:
<#=code.SpaceAfter(NewModifier(set))#><#=Accessibility.ForReadOnlyProperty(set)#> ObjectSet<<#=MultiSchemaEscape(set.ElementType, code)#>> tbl<#=code.Escape(set)#>
由于反射黑客,您需要从生成的EdmEntityTypeAttribute 中删除“tbl”前缀,因此您需要在 line 295 周围找到以下行:
[EdmEntityTypeAttribute(NamespaceName="<#=entity.NamespaceName#>", Name="<#=entity.Name#>")]
并将其更改为:
[EdmEntityTypeAttribute(NamespaceName="<#=entity.NamespaceName#>", Name="<#=entity.Name.Replace("tbl","")#>")]
如果您使用默认的 EF DbContext 生成器 EF5.0 或 EF6.0 和 edmx:
您需要修改 tt 文件以应用您的自定义命名约定。
首先你应该修改<YourEdmxName>.tt文件:
在第 23 行附近,您应该找到以下方法调用:
fileManager.StartNewFile(entity.Name + ".cs");
此方法创建您的实体类,因此如果您想修改生成的文件名,您需要将其更改为:
fileManager.StartNewFile("tbl" + entity.Name + ".cs");
然后在第307行附近你需要找到以下方法声明:
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)));
}
最后你需要修改你的<YourEdmxName>.Context.tt:
在第 296 行附近,您需要找到以下写出 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));
}
然后再次更改以应用您的约定:
public string DbSet(EntitySet entitySet)
{
return string.Format(
CultureInfo.InvariantCulture,
"{0} DbSet<{1}> {2} {{ get; set; }}",
Accessibility.ForReadOnlyProperty(entitySet),
// add "tbl" to the type name DbSet<Table> -> DbSet<tblTable>
"tbl" + _typeMapper.GetTypeName(entitySet.ElementType),
// add "tbl" to property name Tables -> tblTables
"tbl" + _code.Escape(entitySet));
}