プロジェクトのどこかに問題がある可能性があります。あなたの作品に基づいて簡単なアプリケーションを作成しましたが、すべて正常に動作します。試してみて、何が違うのか見てみましょう。
まず、私の単純なコンテキスト:
class MyContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Page>().HasRequired(x => x.Department).WithMany(y => y.Pages).HasForeignKey(x => x.DepartmentId).WillCascadeOnDelete(false);
}
public IDbSet<Page> Pages { get; set; }
public IDbSet<Department> Departments { get; set; }
}
いくつかのデータをデータベースに入れるためのほとんどダミーの初期化子:
class TestInit : DropCreateDatabaseAlways<MyContext>
{
protected override void Seed(MyContext context)
{
base.Seed(context);
var newDepartment = context.Departments.Create();
newDepartment.Name = "test";
context.Departments.Add(newDepartment);
var newPage = context.Pages.Create();
newPage.Department = newDepartment;
context.Pages.Add(newPage);
context.SaveChanges();
// leaving nothing in context
var fullContext = (context as IObjectContextAdapter).ObjectContext;
fullContext.Detach(newDepartment);
fullContext.Detach(newPage);
}
}
そしてあなたのクラス:
public class Page
{
public int ID { get; set; }
public int DepartmentId { get; set; }
public virtual Department Department { get; set; }
}
public class Department
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Page> Pages { get; set; }
}
今度はテスト: Database.SetInitializer(new TestInit());
using (MyContext context = new MyContext())
{
Console.WriteLine(context.Pages.Local.Count);
Console.WriteLine(context.Departments.Local.Count);
var page = context.Pages.First();
Console.WriteLine(page.GetType().FullName);
Console.WriteLine(page.Department.Name);
}
表示されるはずです (プロキシ ハッシュはおそらく少し異なります)。
0
0
System.Data.Entity.DynamicProxies.Page_6D31E91F3B1E767826A19855D3A934B59F85AC161548E4761283C85824520E1D
test
最初の 2 つのゼロは、コンテキスト内にエンティティがないことを確認するためにあります。Page クラスの型はプロキシである必要があります。それがプログラム自体の型である場合、プロキシは生成されていません。おそらく電源がオフになっているか、何かが仮想ではないなどです。最後の行は実際の部門の名前です。
プログラムを実行すると、他のクエリに加えて、次のことも行われます。
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name]
FROM [dbo].[Departments] AS [Extent1]
WHERE [Extent1].[ID] = @EntityKeyValue1
データベースに送信されます。