我的实体数据模型包含有关哪些字段可以为空和不可为空的信息。但是,生成的模板不包含此信息。
在我的代码的其他地方,我JetBrains.Annotations
用来显示允许空值的位置和不允许空值的位置。例如:
[NotNull]
public string Thing([CanBeNull] string s)
{
return s ?? "Was null";
}
如何使 Entity Framework 生成包含这些值分析属性的代码?
我正在通过DbContext
.
我的实体数据模型包含有关哪些字段可以为空和不可为空的信息。但是,生成的模板不包含此信息。
在我的代码的其他地方,我JetBrains.Annotations
用来显示允许空值的位置和不允许空值的位置。例如:
[NotNull]
public string Thing([CanBeNull] string s)
{
return s ?? "Was null";
}
如何使 Entity Framework 生成包含这些值分析属性的代码?
我正在通过DbContext
.
在解决方案资源管理器中,您的.edmx
文件下将有一个.tt
与您的 EDMX 文件同名的文件(不是那个.Context.tt
)。打开此文件进行编辑。
该文件是用于生成实体类源文件的模板。我们将修改模板以在生成的源代码中包含这些属性。
在第 23 行附近,您将看到启动新文件的代码。修改它以发出using
声明:
fileManager.StartNewFile(entity.Name + ".cs");
#>
using JetBrains.Annotations;
<#
BeginNamespace(code);
然后,在第 73 行附近,您将看到一个为属性发出代码的 foreach 循环。将其修改为类似于:
foreach (var edmProperty in simpleProperties)
{
if (edmProperty.TypeUsage.Facets["Nullable"].Value.ToString() == "False")
{
#>
[NotNull]
<#
}
else
{
#>
[CanBeNull]
<#
}
#>
<#=codeStringGenerator.Property(edmProperty)#>
<#
}
保存文件,您的实体.cs
文件将重新生成。打开它们以检查它们是否正确编译。您可能必须添加对这些属性类定义的引用JetBrains.Annotations.dll
或保留这些属性类定义的任何其他位置。
这也会添加[NotNull]
没有意义的值类型,但也不会导致任何问题。如果有人对支持模板的模型有更多了解并可以建议如何进一步改进,我很想听听。