私はエンティティフレームワーク5を使用しています。エンティティコレクションを遅延ロードしようとしています。モデルを必要最低限の部分まで削除して、単純な実行可能なサンプルを作成しました。
これは私のモデルです:
public class A
{
public int Id { get; set; }
public EntityCollection<B> Bs
{
get { return bs; }
set { bs = value; }
}
private EntityCollection<B> bs;
public A()
{
bs = new EntityCollection<B>();
}
}
public class B
{
public int Id { get; set; }
public A A { get; set; }
}
public class DbModel : DbContext
{
public DbSet<A> As { get; set; }
public DbSet<B> Bs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<A>()
.HasKey( t => t.Id )
.HasMany(a => a.Bs)
.WithRequired(b => b.A);
modelBuilder.Entity<A>()
.Property(t => t.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<B>()
.HasKey(b => b.Id)
.HasRequired(b => b.A);
modelBuilder.Entity<B>()
.Property( t => t.Id )
.HasDatabaseGeneratedOption( DatabaseGeneratedOption.Identity );
}
これは私の問題を示すテストです:
[TestInitialize]
public void Initialize()
{
model = new DbModel();
model.Configuration.ProxyCreationEnabled = false;
if (model.Database.Exists()) model.Database.Delete();
model.Database.Create();
A a = model.As.Create();
model.As.Add(a);
B b = model.Bs.Create();
a.Bs.Add(b);
model.ChangeTracker.DetectChanges();
model.SaveChanges();
}
[TestMethod]
public void TestMethod1()
{
// arrange
DbModel tModel = new DbModel();
A a = tModel.As.First();
// act
a.Bs.Load();
}
結果は次のとおりです。
テストメソッドTestProject1.UnitTest1.TestMethod1が例外をスローしました:
System.InvalidOperationException:このRelatedEndの所有者がnullの場合、要求された操作は許可されません。デフォルトのコンストラクターで作成されたRelatedEndオブジェクトは、シリアル化中のコンテナーとしてのみ使用する必要があります。