我的Visual Studio项目中有一个edmx文件,当您将模型中的表插入到edmx中时,它的名称与数据库中的名称相同,例如,通过导入myTable
,您将得到一个名为myTable
的实体,名称为myTables
。
在将表添加到我的文件中时,如何使表遵循自定义命名约定?因此,例如,添加myTable
会导致名为tblmyTable
的实体设置名称为tblmyTables
。
答案 0 :(得分:6)
您需要在多个位置修改 <YourModelName>.tt
文件。
模板调用container.BaseEntitySets.OfType<EntitySet>()
以获取所有实体集,其中返回的EntityeSet.ElementType
(ElementType
的类型为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#>")]
您需要修改[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));
}