Entity Framework 数据库优先和列属性不起作用
Entity Framework database-first and column attribute does not work
我有一个数据库,所有主键都以 _Id
结尾。对于我的 EF 类,我想省略下划线,所以我将用于生成属性的 T4 模板更改为此 (CodeStringGenerator.Property
):
public string Property(EdmProperty edmProperty)
{
var dbName = _code.Escape(edmProperty);
var propResult = "";
if(dbName.Contains("_"))
{
propResult = "[Column(\"" + dbName + "\")]\r\n\t";
dbName = dbName.Replace("_", "");
}
return propResult + string.Format(
CultureInfo.InvariantCulture,
"{0} {1} {2} {{ {3}get; {4}set; }}",
Accessibility.ForProperty(edmProperty),
_typeMapper.GetTypeName(edmProperty.TypeUsage),
dbName,
_code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
_code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
}
这将从 属性 名称中删除所有“_”并将列属性写入 属性。但这似乎破坏了 EF。使用 column 属性,每当我尝试进行诸如选择实体之类的操作时,EF 都会抛出异常。
例外情况是:
The entity type ENTITY is not part of the model for the current context.
如果我像在数据库中那样写原始名称,它 EF 将与实体一起工作,但如果我添加列属性则不会。
有没有办法重命名所有属性或使列属性起作用?
使用 EF6.2
经过一些 天 的研究后,除了使用 AutoMapper 将列单向转换为 Entity.Property 名称之外,我没有找到其他方法,所以我决定将我的 ORM 切换到一个更简单的方法,主要与数据库优先方法一起工作。
结论:不可能
我有一个数据库,所有主键都以 _Id
结尾。对于我的 EF 类,我想省略下划线,所以我将用于生成属性的 T4 模板更改为此 (CodeStringGenerator.Property
):
public string Property(EdmProperty edmProperty)
{
var dbName = _code.Escape(edmProperty);
var propResult = "";
if(dbName.Contains("_"))
{
propResult = "[Column(\"" + dbName + "\")]\r\n\t";
dbName = dbName.Replace("_", "");
}
return propResult + string.Format(
CultureInfo.InvariantCulture,
"{0} {1} {2} {{ {3}get; {4}set; }}",
Accessibility.ForProperty(edmProperty),
_typeMapper.GetTypeName(edmProperty.TypeUsage),
dbName,
_code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
_code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
}
这将从 属性 名称中删除所有“_”并将列属性写入 属性。但这似乎破坏了 EF。使用 column 属性,每当我尝试进行诸如选择实体之类的操作时,EF 都会抛出异常。
例外情况是:
The entity type ENTITY is not part of the model for the current context.
如果我像在数据库中那样写原始名称,它 EF 将与实体一起工作,但如果我添加列属性则不会。
有没有办法重命名所有属性或使列属性起作用? 使用 EF6.2
经过一些 天 的研究后,除了使用 AutoMapper 将列单向转换为 Entity.Property 名称之外,我没有找到其他方法,所以我决定将我的 ORM 切换到一个更简单的方法,主要与数据库优先方法一起工作。
结论:不可能