C#Entity Framework属性(有时)为空

时间:2016-01-22 21:32:17

标签: c# .net winforms entity-framework entity-framework-6

因此,当使用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"));

}

2 个答案:

答案 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或类级变量中保留对象的引用。所以稍后,如果我需要,我仍然可以参考该对象。