我应该如何为我的平板电脑建模,以便它们与 Entity Framework 配合良好?

How should I model my tables so they work well with Entify Framework?

所以我尝试使用 Entity Framework(代码优先)对以下内容进行建模。

public class School
{
    public string Name { get; set; }

    public IEnumerable<Class> Classes { get; set; }
}

public class Class
{
    public string Name { get; set; }

    public TypeOfClass Type { get; set; }

    public IEnumerable<Student> Students { get; set; } 
}

public enum TypeOfClass
{
    Kindergarten,
    HighSchool
}

public class Student
{
    public string Name { get; set; }
}

public class Kid : Student
{
    public string FavouriteToy { get; set; }
}

public class Teenager : Student
{
    public int AmountOfAcne { get; set; }
}

我想知道我应该如何为我的实体(和表)建模,以便我可以对 select School 中的所有 Student 执行类似的操作:

var school = new School();

var kindergartenClass = new Class
{
    Name = "Kindergarten",
    Type = TypeOfClass.Kindergarten,
    Students = new List<Kid>()
};

var highschoolClass = new Class
{
    Name = "Kindergarten",
    Type = TypeOfClass.HighSchool,
    Students = new List<Teenager>()
};

school.Classes = new List<Class> {kindergartenClass, highschoolClass};

IEnumerable<Student> students = school.Classes.SelectMany(x => x.Students);

我不想为儿童和青少年设置单独的表格,因为它们具有不同的属性,并且只会共享一个子集或共同属性。

谁有好的建议? :)

您将需要一个 Id(键)列。集合的导航属性应该是 ILIst<>

public class School
{
  // Id and SchoolId are automatically recognized
  public int SchoolId { get; set; }    
  public string Name { get; set; }
  // use an IList so that you can Add()
  public IList<Class> Classes { get; set; }
}

对于继承的 类 你将不得不 pick a TPC/TPT/TPH model

首先,您的 classes 应该具有可以被 EF 识别为主键的属性。通常这些是 non-nullable 名称为 Id 或 [ClassName]Id:

的整数
public class School
{
    public int Id { get; set; } // or SchoolId
}

public class Class
{
    public int Id { get; set; } // or ClassId
}

public class Student
{
    public int Id { get; set; } // or StudentId
}

您有两个选项可以将儿童和青少年映射到 tables:

  • Table 每个类型 (TPT) - 基础 class(在本例中为学生)有自己的 table,而儿童和青少年各有一个 table回到学生的关键关联 table.
  • Table 每个混凝土类型 (TPC) - 儿童和青少年获得他们自己的 tables 和基础 class 中的所有属性(在这种情况下名称 属性 来自学生 class) 在所有 child table 中复制。

我想你追求的是TPC。另外,我认为您只希望儿童和青少年拥有 table(而不是学生)。如果是这样,您需要将 Student class 抽象为:

public abstract class Student
{
    // ... 
}

并且您需要在上下文中覆盖 OnModelCreating 方法:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Kid>().Map(m =>
    {
        m.ToTable("Kids");
        m.MapInheritedProperties();
    });

    modelBuilder.Entity<Teenager>().Map(m =>
    {
        m.ToTable("Teenagers");
        m.MapInheritedProperties();
    });
}