私は現在、Code First アプローチを通じて Entity Framework (EF) を学習しています。新しく作成されたデータベース (つまり、EF によって作成されたデータベース) で、Professor
s とes の間の単純な 1 対多の関係をモデル化したいと考えています。Class
私のモデルでは、 a にesProfessor
のコレクションがあります。Class
AClass
には常に 1 がProfessor
関連付けられています (つまり、対応するプロパティが null になることはありません)。Class
および関連付けられた を作成して保存できますが、データベースから取得した のプロパティProfessor
にアクセスすると、空になります。ただし、 から その への移動は可能です。Classes
Professor
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)
生成された DB スキーマは次のとおりです。
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
コレクション プロパティはスキーマのどこにも表示されません。それは意図したものですか?
誰かがこれに光を当てることができますか? 私が見つけたすべての例は、コレクションのプロパティについて詳しく説明していません。