因此,当使用EF时,我有一个非常奇怪的问题,有时类的属性为空,有时则不是。在这种情况下, ParentType 通常为null,它应该具有值
使用以下代码,DOES有一个值:
using (Context context = new Context())
{
checkedListBox_SubTypes.DataSource = context.Types.Where(x => x.ParentType != null && x.ParentType.TypeID == _selectedType.TypeID).ToList();
}
然而,对于这行代码,我试图从列表框中取出相同的对象,它的ParentType变为null
以下是关于如何设置的类和数据库图表:
public class Type
{
#region Fields
#endregion Fields
#region Constructor
public Type()
{
}
#endregion Constructor
#region Properties
public int? TypeID { get; set; }
[DisplayName("Type")]
public string TypeName { get; set; }
public Type ParentType { get; set; }
/// <summary>
/// List of Types this Type is associated with (Parent / Sub)
/// </summary>
public virtual ICollection<Type> Types { get; set; }
public virtual ICollection<Object> Objects { get; set; }
#endregion Properties
上下文:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//Set Many-To-Many relationship Mapping between Object & Type
modelBuilder.Entity<ObjectType>()
.HasMany(x => x.Objects)
.WithMany(x => x.Types)
.Map(m => m.ToTable("ObjectType")
.MapLeftKey("TypeID")
.MapRightKey("ObjectNumber"));
//Set One-To-Many relationship Mapping between Type &(Parent)Type
modelBuilder.Entity<Type>()
.HasMany(x => x.Types)
.WithOptional(x => x.ParentType)
.Map(m => m.ToTable("Type")
.MapKey("ParentTypeID"));
}
答案 0 :(得分:2)
我很确定你的第一个代码片段ParentMatterType
也是null。让我们稍微改变一下:
using (LitTrackContext context = new LitTrackContext())
{
var types = context.MatterTypes
.Where(x => x.ParentMatterType != null
&& x.ParentMatterType.MatterTypeID == _selectedMatterType.MatterTypeID)
.ToList();
checkedListBox_MatterSubTypes.DataSource = types;
}
如果您在调试器中检查types
,则会看到其中没有ParentMatterType
。那是因为该属性不是virtual
,所以它不会延迟加载(如果你在调试器中检查它会发生这种情况)。
即使您创建了属性virtual
,您也无法在以后看到其内容,因为上下文会立即处理(顺便说一句,这是好的)。如果您之后尝试访问ParentMatterType
,EF会抛出异常。
您应该通过更改第一部分来查找Include
查询中的属性:
var types = context.MatterTypes.Include(m => m.ParentMatterType)
...
答案 1 :(得分:-1)
一旦将数据源绑定到控件上,我就有同样的问题检索数据源,在我的例子中是DataGrids。我从来没有弄清楚为什么会这样或进一步调查。要解决这个问题,我通常会做的是在将Session分配给控件之前,在Session或ViewState或类级变量中保留对象的引用。所以稍后,如果我需要,我仍然可以参考该对象。