我前段时间使用旧的ObjectContext模板制作了一个EF项目(数据库优先)。这会将所有东西都集成到一个巨大的honkin'文件。这有一些缺点,比如我想要查看文件,IDE需要一段时间才能将其全部加载到内存中,修改需要一段时间才能刷新。另外,它使源代码控制历史中的内容很难看出来:如果我想知道改变了什么,我必须在一个巨大文件的两个版本之间进行文件差异,而不是简单地看到隔离文件中的更改,生成为每班一个。
所以我决定尝试修改一个代码模板来生成相同的代码,每个类只有一个文件。而且我认为我做得很好,因为代码编译得很好......但是当我打开应用程序时,我收到错误:
指定的架构无效。错误:
该关系的属性&评估学校'包含角色评估'有一个类型' SchoolManagement.BL.Assessment'这对于关系End无效。将结束角色更改为EntityType。
该关系的属性&评估学校'包含一个角色' School'有一个类型' SchoolManagement.BL.School'这对于关系End无效。将结束角色更改为EntityType。
它继续列出系统中的每个多对多交叉表(两次;关系的每一端一个)。对于AssessmentSchool
,该表格只有AssessmentID
和SchoolID
。
因此,我比较了旧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
课程中,但我不打算在此处列出。
这段代码看起来与我完全相同,并且编译得很好,但它只会抛出上面的运行时错误。显然,我失踪的地方还有另一个伎俩。但是什么?
答案 0 :(得分:0)
发现问题:我在没有装饰器的情况下生成EntityObject
类:
[EdmEntityTypeAttribute(NamespaceName="SchoolManagement.BL", Name="Assessment")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class Assessment : EntityObject
{
...
}