我正在使用DBContext并且有两个类,其属性都是虚拟的.我可以在调试器中看到,当我查询上下文时,我正在获取代理对象.但是,当我尝试添加它时,collection属性仍为null.我认为代理将确保集合初始化.
因为我的Poco对象可以在其数据上下文之外使用,所以我在构造函数中添加了对集合为null的检查,并在必要时创建它:
public class DanceStyle
{
public DanceStyle()
{
if (DanceEvents == null)
{
DanceEvents = new Collection<DanceEvent>();
}
}
...
public virtual ICollection<DanceEvent> DanceEvents { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这在数据上下文之外工作但是如果我使用查询检索对象,虽然测试是真的,但是当我尝试设置它时,我得到以下异常:'类型'DanceStyle_B6089AE40D178593955F1328A70EAA3D8F0F01DDE9F9FBD615F60A34F9178B94'上的属性'DanceEvents'无法设置,因为集合已经设置为EntityCollection.
我可以看到它是null并且我无法添加它,但我也不能将它设置为集合,因为代理已经设置它.因此我无法使用它.我糊涂了.
这是DanceEvent类:
public class DanceEvent
{
public DanceEvent()
{
if (DanceStyles == null)
{
DanceStyles = new Collection<DanceStyle>();
}
}
...
public virtual ICollection<DanceStyle> DanceStyles { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我从上面的代码中省略了其他值类型属性.我在上下文类中没有其他类的映射.
几乎所有为Entity Framework 4.1创建的POCO类的示例都是使用ICollection接口定义的:
public class TravelTicket
{
public virtual int Id { get; set; }
public string Destination { get; set; }
public virtual ICollection<Person> Members { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是,这会导致我的代码中的问题,我需要通过索引访问集合的成员,例如:
Paul Paul = TravelTicket.Members [3];
无法将带有[]的索引应用于类型为"System.Collections.Generic.ICollection"的表达式
那么我该如何解决这个问题呢?我应该总是将ICollection用于我的POCO集合吗?