EF代码生成模板:发现差异?

时间:2015-03-22 12:15:49

标签: c# entity-framework code-generation

我前段时间使用旧的ObjectContext模板制作了一个EF项目(数据库优先)。这会将所有东西都集成到一个巨大的honkin'文件。这有一些缺点,比如我想要查看文件,IDE需要一段时间才能将其全部加载到内存中,修改需要一段时间才能刷新。另外,它使源代码控制历史中的内容很难看出来:如果我想知道改变了什么,我必须在一个巨大文件的两个版本之间进行文件差异,而不是简单地看到隔离文件中的更改,生成为每班一个。

所以我决定尝试修改一个代码模板来生成相同的代码,每个类只有一个文件。而且我认为我做得很好,因为代码编译得很好......但是当我打开应用程序时,我收到错误:

  

指定的架构无效。错误:

     

该关系的属性&评估学校'包含角色评估'有一个类型' SchoolManagement.BL.Assessment'这对于关系End无效。将结束角色更改为EntityType。

     

该关系的属性&评估学校'包含一个角色' School'有一个类型' SchoolManagement.BL.School'这对于关系End无效。将结束角色更改为EntityType。

它继续列出系统中的每个多对多交叉表(两次;关系的每一端一个)。对于AssessmentSchool,该表格只有AssessmentIDSchoolID

因此,我比较了旧MyContext.designer.cs中关系的声明,找到了提及关系的任何地方,并与新代码进行了比较。你能发现差异吗?

旧数据上下文:

[assembly: EdmRelationshipAttribute("SchoolManagement.BL", "AssessmentSchool", "Assessment", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(SchoolManagement.BL.Assessment), "School", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(SchoolManagement.BL.School))]

新数据背景:

[assembly: EdmRelationshipAttribute("SchoolManagement.BL", "AssessmentSchool", "Assessment", RelationshipMultiplicity.Many, typeof(SchoolManagement.BL.Assessment), "School", RelationshipMultiplicity.Many, typeof(SchoolManagement.BL.School), false)]

(是的,存在细微差别:新文件在文件顶部有using System.Data.Metadata.Edm语句,false参数的isForeignKey无论如何都是默认值。我尝试手动删除该参数,但没有任何区别。)

OLD评估课程:

[XmlIgnoreAttribute()]
[SoapIgnoreAttribute()]
[DataMemberAttribute()]
[EdmRelationshipNavigationPropertyAttribute("SchoolManagement.BL", "AssessmentSchool", "School")]
public EntityCollection<School> Schools
{
    get
    {
        return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<School>("SchoolManagement.BL.AssessmentSchool", "School");
    }
    set
    {
        if ((value != null))
        {
            ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<School>("SchoolManagement.BL.AssessmentSchool", "School", value);
        }
    }
}

新评估课程:

    [XmlIgnoreAttribute()]
    [SoapIgnoreAttribute()]
    [DataMemberAttribute()]
    [EdmRelationshipNavigationPropertyAttribute("SchoolManagement.BL", "AssessmentSchool", "School")]
    public virtual EntityCollection<School> Schools
    {
        get
        {
            return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<School>("SchoolManagement.BL.AssessmentSchool", "School");
        }
        set
        {
            if ((value != null))
            {
                ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<School>("SchoolManagement.BL.AssessmentSchool", "School", value);
            }
        }
    }

对称关系也在Class课程中,但我不打算在此处列出。

这段代码看起来与我完全相同,并且编译得很好,但它只会抛出上面的运行时错误。显然,我失踪的地方还有另一个伎俩。但是什么?

1 个答案:

答案 0 :(得分:0)

发现问题:我在没有装饰器的情况下生成EntityObject类:

[EdmEntityTypeAttribute(NamespaceName="SchoolManagement.BL", Name="Assessment")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class Assessment : EntityObject
{
  ...
}