为什么实体框架中不允许以下划线开头的属性?

时间:2014-02-28 09:10:41

标签: entity-framework naming-conventions

当您尝试将Entity Framework设计器中的属性命名为带有下划线的名称时,您将收到以下错误:Navigation Name '_PropertyName' is not valid.

请参阅:https://stackoverflow.com/a/10854740/647845

为什么会增加此限制?对我来说这感觉很随意。

1 个答案:

答案 0 :(得分:2)

EF源代码可用(http://entityframework.codeplex.com/),所以我们可以直接看一下,不需要依赖某种形式的反编译。

搜索正则表达式显示:

// Replace anything that doesn't adhere to the ECMA specification for identifiers with an underscore,
// unless it's the first which the schema definition says must be a letter...
// System.Data.Resource.CSMSL_2.xsd - [\p{L}\p{Nl}][\p{L}\p{Nl}\p{Nd}\p{Mn}\p{Mc}\p{Pc}\p{Cf}]{0,}
<{3>}中的

查找该架构文件:无法找到,但将其更改为System.Data.Resources.CSMSL_2.xsd会显示三个文件:setup中的一个文件和test中的一个文件,我将假设它们是第三:src/EFTools/EntityDesignModel/ModelHelper.cs

这确实使用相同的正则表达式作为TSimpleIdentifier类型的约束。

因此,回答你的问题:

  

为什么会增加此限制?对我来说这感觉很随意。

因为这是对基础EF模型施加的限制。要理解为什么你需要在开始时询问那些设计EF的人。

是的,是任意的。但是,所有标识符命名规则都是仲裁的。例如

  • 某些内容允许使用连字符,而不是名称中的下划线,但这些不能直接映射到.NET标识符
  • C#和F#允许使用不同的.NET CLR标识符子集(F#标识符可以包含空格!)
  • 这是C#中的匿名类型在运行时可以具有名称但无法在源代码中命名的方式:编译器生成的名称中出现的<>字符适用于CLR的运行时