我创建了一个带有数据库第一种方法的edmx文件,并在T4模板中调整了从User.Contact1
到User.DefaultContact
的导航属性名称,如下所示
string foreignKeyName = navigationProperty.RelationshipType.Name;
string customizedPropertyName = customizedPropertyNames
.Where(x => x.EntityName == entity.Name && foreignKeyName == x.ForeignKeyName)
.FirstOrDefault()?.PropertyName;
string propertyDefinition = codeStringGenerator.NavigationProperty(navigationProperty, customizedPropertyName);
名称已成功更改,但会导致运行时MetadataException
System.Data.Entity.Core.MetadataException : Schema specified is not valid. Errors:
The relationship 'Model.FK_User_Contact' was not loaded because the type 'User' is not available.
The following information may be useful in resolving the previous error:
The required property 'Contact1' does not exist on the type 'User'.
然后,当我也手动更改了edmx中的导航属性名称时,错误就消失了。
<EntityType Name="User">
<NavigationProperty Name="DefaultContact" Relationship="Self.FK_User_DefaultContact" FromRole="User" ToRole="Contact" />
</EntityType>
我的问题是
为什么edmx文件会影响运行时行为(修复异常)?它不应该只是一个设计时工具吗?在edmx修改之后,我重新运行所有T4模板。它不会导致所有生成的C#代码发生变化(在git中验证)
错误的根本原因是什么。有没有办法解决这个问题只需T4模板改编,无需手动编辑edmx文件?
我认为edmx仅用于设计时间是错误的。它还被编译为3个嵌入式资源文件(.csdl,.msl,.ssdl)。导航属性名称也在.csdl文件中定义。 调整T4模板将创建与csdl文件不匹配的C#模型类,这就是导致MetadataException的原因。
那么问题是,怎么会有这么多Stackoverflow answers建议调整T4模板是生成自定义导航属性名称的方法?