我正在使用EF codefirst。我对实体中的关系感到困惑。我有两个实体StudentStandard。如下图所示

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)
{
   //...
}


本质上,这不是纯粹与实体框架有关的问题,而是与关系数据库有关的问题。

看看ACIDForeign Keys

关于c# - Entity Framework 和联接表达式中的一对多配置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22038665/

10-13 01:47