我正在使用EF codefirst。我对实体中的关系感到困惑。我有两个实体Student
和Standard
。如下图所示
public class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
public int StdandardId { get; set; }
}
public class Standard
{
public int StandardId { get; set; }
public string StandardName { get; set; }
public string Description { get; set; }
}
他们有一对多的关系。
我可以通过这样的简单连接表达式来做到这一点
var list = StudentList.Join
(StandardList,c => c.StdandardId,o => o.StandardId,(c, o) => new
{
StudentId = c.StudentId,
StudentName = c.StudentName,
StandardName = o.StandardName
});
那我为什么要配置forienkey一对多关系
public class Student
{
public Student() { }
public int StudentId { get; set; }
public string StudentName { get; set; }
public int StdandardId { get; set; }
public virtual Standard Standard { get; set; }
}
public class Standard
{
public Standard()
{
Students = new List<Student>();
}
public int StandardId { get; set; }
public string StandardName { get; set; }
public string Description { get; set; }
public virtual ICollection<Student> Students { get; set; }
}
有什么主要的好处吗?哪一个表现良好?
最佳答案
这个问题可能会导致答案随论文的大小而变化。
我会尽量保持必要。简而言之,外键用于确保引用完整性。
在您的select语句中,这可能没有什么不同,但请考虑一下update,insert和delete语句,以及将所有内容层叠到最后一张表所必需的障碍。
假设您的外键约束设置为Cascade
。每当您对主表进行更改时,该更改都会级联到每个子表中。您必须手动联接语句中的每个表才能实现相同的表。
如果约束设置为Restrict
,只要仍然有Student
引用它,就不能删除它。同样,您每次都必须在报表中手工检查此内容。
您可能很容易做到这一点,但是您会犯一个错误,然后当资金短缺时,您可能会遇到数据不一致的情况。
然后在EF中有安慰。
我可以合并数据,但是如果有外键和tehrefore关系,我可以编写
var students = context.Students.Include(o => o.Enrollments);
并在我的视图中使用
@foreach(var enrollment in Model.Enrollments)
{
//...
}
本质上,这不是纯粹与实体框架有关的问题,而是与关系数据库有关的问题。
看看ACID和Foreign Keys
关于c# - Entity Framework 和联接表达式中的一对多配置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22038665/