EF4.3コードファーストデータベースからエンティティをロードする際に問題が発生しました。コードを次の実用的なサンプルコードに簡略化しました。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity.Infrastructure;
namespace CodeFirst {
class Program {
static void Main(string[] args) {
Database.SetInitializer(new DropCreateDatabaseAlways<Context>());
Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");
using (Context context = new Context()) {
A a = new A { B = new B { Foo = 1 } };
context.As.Add(a);
context.SaveChanges();
Print(context); // B has ID=1, Foo=1
}
using (Context context = new Context()) {
Print(context); // B is null
}
Console.ReadLine();
}
public static void Print(Context context) {
A a = context.As.Single();
Console.WriteLine("A: ID=" + a.Id);
if (a.B == null) {
Console.WriteLine("B: null");
}
else {
Console.WriteLine("B: ID=" + a.B.Id + ", Foo=" + a.B.Foo);
}
}
}
class Context : DbContext {
public DbSet<A> As { get; set; }
}
class A {
public int Id { get; set; }
public B B { get; set; }
}
class B {
public int Id { get; set; }
public int Foo { get; set; }
}
}
出力は次のとおりです。
A: ID=1
B: ID=1, Foo=1
A: ID=1
B: null
このサンプルコードでは、何らかの理由A
で新しいを取得するとContext
、そのサブプロパティB
はnull
です。ブレークポイントを設定し、がのポイントでデータベースに接続するB
とnull
、すべてが正常に表示されます。
Table: A
--------
Id B_Id
1 1
Table: B
--------
Id Foo
1 1
私はコードファーストを学ぼうとしているだけなので、ここでひどい誤解があるかもしれませんが、これは私には非常に奇妙に思えます。誰かがこの振る舞いを説明できますか?