我对EF不太了解,因此请耐心尝试我的无知和困惑。我有一个限制,我无法更改数据库结构。
TBLGRADES
GRADEID GUID (PK) | GRADETITLE VARCHAR
--------------------------------------------------------------
882349d4-2564-4160-a034-2a5116dec389 | Cool Grade
59539804-5c47-46ac-873d-65b33ce6ac94 | Not so cool grade
b00d6cdd-3273-4f83-8d18-0c9e9a3e1562 | Lame Grade
TBLGRADES关系
GRADEID GUID (FK) | ELIGIBLEGRADEID GUID (FK)
----------------------------------------------------------------------------
882349d4-2564-4160-a034-2a5116dec389 | 59539804-5c47-46ac-873d-65b33ce6ac94
882349d4-2564-4160-a034-2a5116dec389 | b00d6cdd-3273-4f83-8d18-0c9e9a3e1562
我希望首先使用EF代码来表示这一点,但由于我不了解EF的工作原理而感到困惑,但是我可以使用EF代码生成使其正常工作。如果我不能先使用代码来使它正常工作,那么我只需要满足EF代码生成的要求。希望有人可以清除我脑海中的乌云。
实体
[Table("TBLGRADES")]
public class Grade
{
public GUID GradeId { get; set; }
public string GradeTitle { get; set; }
public virtual ICollection<Grade> EligibleGrades { get; set; }
}
我只是希望一个代表酷等级的等级实体实例,按照TBLGRADESRELATIONSHIPS,有一个等级实体(EligibleGrades)(计数:2)的集合,其中1个实例不是很酷,而1个of脚等级是。
var grade = rep.GetGradeByID(Guid.Parse("882349d4-2564-4160-a034-2a5116dec389"));
grade.EligibleGrades[0] //Not so cool grade
grade.EligibleGrades[1] //lame grade
请帮助我了解关联,以便我可以正常工作。欣赏它。我的第一则SO发布,请保持温柔。
这是一种(自我引用)多对多关系:一个等级可以有许多合格的等级,而一个等级可以是许多其他等级的合格等级。你可以把它仿佛在Grade
实体有另一个(隐藏)集合,如:
public class Grade
{
public GUID GradeId { get; set; }
public string GradeTitle { get; set; }
public virtual ICollection<Grade> EligibleGrades { get; set; }
public virtual ICollection<Grade> GradesThisIsAnEligibleGradeFor { get; set; }
}
名称太丑了,我们只是再次删除集合。但是您仍然必须告诉EF关系是多对多的。如果“代码优先”模型发现仅看到一个集合,则它始终假定一对多关系(TBLGRADES
表中不存在外键)。您必须使用Fluent API覆盖默认约定,以代替创建多对多关系:
modelBuilder.Entity<Grade>()
.HasMany(g => g.EligibleGrades)
.WithMany() // <- parameterless because there's no 2nd (inverse) collection
.Map(m =>
{
m.ToTable("TBLGRADESRELATIONSHIPS");
m.MapLeftKey("GRADEID");
m.MapRightKey("ELIGIBLEGRADEID");
});
您问题中的最后一个代码片段现在应可与此映射一起使用,并准确给出您期望的结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句