我目前正在通过 Code First 方法学习实体框架 (EF)。我想在新创建的数据库(即由 EF 创建)上建模Professor
s 和es之间的简单一对多关系。Class
在我的模型中,aProfessor
有一个Class
es 的集合。AClass
总是有一个Professor
与之关联的(即相应的属性永远不会为空)。我可以创建和存储 aClass
和关联的Professor
,但是当我访问从数据库中检索到Classes
的 a 的属性时Professor
,它是空的。然而,从 a 导航Class
到它的是可能的。Professor
考虑以下模型:
class Class
{
public int Id { get; set; }
public string Title { get; set; }
public virtual Professor Professor { get; set; }
}
class Professor
{
public int Id { get; set; }
public string Name { get; set; }
private ICollection<Class> classes = null;
public virtual ICollection<Class> Classes
{
get { return classes ?? (classes = new HashSet<Class>()); }
set { classes = value; }
}
}
class ClassManager : DbContext
{
public DbSet<Professor> Professors { get; set; }
public DbSet<Class> Classes { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Class>().HasRequired(c => c.Professor);
}
}
在我的主要方法中,我创建和访问我的数据,如下所示:
using (ClassManager db = new ClassManager())
{
Professor p = new Professor() { Name = "McTest" };
Class c = new Class() { Title = "Testing Tests", Professor = p };
p.Classes.Add(c);
db.Professors.Add(p);
db.Classes.Add(c);
Console.WriteLine(db.SaveChanges() + " change(s) saved.");
}
using (ClassManager db = new ClassManager())
{
foreach (Professor p in db.Professors)
Console.WriteLine("Prof. " + p.Name + " gives " + p.Classes.Count
+ " classes.");
foreach (Class c in db.Classes)
Console.WriteLine(c.Title + " (Prof. " + c.Professor.Name + ")");
}
输出是:
3 change(s) saved.
Prof. McTest gives 0 classes.
Testing Tests (Prof. McTest)
生成的数据库模式是:
table Classes
column Id (PK, int, not null)
column Title (nvchar(max), null)
column Professor_Id (FK, int, not null)
table Professors
column Id (PK, int, not null)
column Name (nvchar(max), null)
如您所见,Classes
集合属性不会出现在架构中的任何位置。这是故意的吗?
有人可以对此有所了解吗?我发现的所有示例都不会详细介绍集合属性。