我正在使用实体框架 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 的所有者为空时,不允许请求的操作。使用默认构造函数创建的 RelatedEnd 对象只能在序列化期间用作容器。