我应该如何为我的平板电脑建模,以便它们与 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();
});
}
所以我尝试使用 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();
});
}