为什么edmx文件会影响运行时行为

时间:2017-09-06 00:53:46

标签: c# sql-server entity-framework t4 edmx

我创建了一个带有数据库第一种方法的edmx文件,并在T4模板中调整了从User.Contact1User.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>

我的问题是

  1. 为什么edmx文件会影响运行时行为(修复异常)?它不应该只是一个设计时工具吗?在edmx修改之后,我重新运行所有T4模板。它不会导致所有生成的C#代码发生变化(在git中验证)

  2. 错误的根本原因是什么。有没有办法解决这个问题只需T4模板改编,无需手动编辑edmx文件?

  3. 更新

    我认为edmx仅用于设计时间是错误的。它还被编译为3个嵌入式资源文件(.csdl,.msl,.ssdl)。导航属性名称也在.csdl文件中定义。 调整T4模板将创建与csdl文件不匹配的C#模型类,这就是导致MetadataException的原因。

    那么问题是,怎么会有这么多Stackoverflow answers建议调整T4模板是生成自定义导航属性名称的方法?

0 个答案:

没有答案