gpt4 book ai didi

.net - EF 的自定义实体命名规则

转载 作者:行者123 更新时间:2023-12-04 12:08:06 25 4
gpt4 key购买 nike

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

将表添加到我的文件时,如何使它们遵守自定义命名约定?因此,例如,添加 myTable结果是一个名为 tblmyTable 的实体与集合名称 tblmyTables .

最佳答案

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

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

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

这些对象在模板中的许多地方使用,因此最简单的解决方案是设置 Name EntityType 的属性(property).然而Name属性是内部的,所以你需要使用反射来设置它。

因此,在您的模板中找到以下行 第 163 行 :

region.Begin(CodeGenerationTools.GetResourceString("Template_RegionObjectSetProperties"));
foreach (EntitySet set in container.BaseEntitySets.OfType<EntitySet>())
{

并且您需要在此处添加以下代码来设置 Name属性(property):
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);

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

首先,生成的属性名称不是固定的,因此您需要在行 附近找到以下行第 173 行 :
<#=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)#>

由于反射黑客,您需要从生成的 EdmEntityTypeAttribute 中删除“tbl”前缀。所以你需要在 附近找到以下行第 295 行 :
[EdmEntityTypeAttribute(NamespaceName="<#=entity.NamespaceName#>", Name="<#=entity.Name#>")]

并将其更改为:
[EdmEntityTypeAttribute(NamespaceName="<#=entity.NamespaceName#>", Name="<#=entity.Name.Replace("tbl","")#>")]

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

您需要修改 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));
}

关于.net - EF 的自定义实体命名规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23257595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com