在EF7中进行预先加载时出现ArgumentException

时间:2016-02-26 14:13:54

标签: c# entity-framework entity-framework-core

我正在尝试加载具有多个导航属性的模型。大多数引用的模型加载正常,但在尝试Include()引用的列表时,项目与System.ArgumentException - Static field requires null instance, non-static field requires non-null instance崩溃。

装载

var project =
    db
    .Projects
    .Include(x => x.Fittings) // offending Include
    .Include(x => x.CostParameter) // works
    .Include(x => x.ProcessParameter) // works
    .Include(x => x.CreatedByUser) // works
    .Single(x => x.Id == package.IsPartOfProjectId);

为了使问题更复杂,有问题的List是一个抽象类。此外,列表还可以包含另一个抽象类的子类。

modelBuilder.Entity<ButtWrap>().HasBaseType<Fitting>();
modelBuilder.Entity<Elbow>().HasBaseType<ButtWrap>();

模型配置

modelBuilder.Entity<Project>()
    .HasMany(x => x.Fittings)
    .WithOne(x => x.Project)
    .IsRequired()
    .OnDelete(DeleteBehavior.Cascade);

项目模型

public sealed class Project : CommonTypes.ProjectBase
{
    public int ProjectTrackingNumber { get; set; }
    public string Name { get; set; }
    public bool IsManufacture { get; set; }
    public bool IsCostEstimate { get; set; }  
    public string QueueStatus { get; set; }    
    public DateTime CreatedAt { get; set; }

    public List<Fitting> Fittings { get; set; } = new List<Fitting>();
    public Meta Meta { get; set; }
    public FittingsInterfaceUser CreatedByUser { get; set; }

    public CostParameter CostParameter { get; set; }
    public ProcessParameter ProcessParameter { get; set; }
}

public class ProjectBase : EntityBaseIdentifier, IAggregateRoot
{
    public ProjectBase(long entityId) : base(entityId)
    {

    }

    protected override void Validate()
    {
        throw new NotImplementedException();
    }
}

除了一些复杂的结构外,我实际上已经提前完成了这项工作。然而,在某个地方,我引入了一个错误。

由于错误有点神秘,我不知道从哪里开始寻找,所以欢迎所有建议。

1 个答案:

答案 0 :(得分:0)

问题当然是我在原始问题中没有发布的其中一个课程。我愚蠢地在抽象的“getter”类中添加了一个只有Fittings的抽象字段。所以,有趣的是,“神秘的错误信息”实际上现在已经完全合理了。

public abstract string FittingsType { get; }

引入此字段是为了帮助遗留系统,并始终从实现基类返回硬编码值。

非常感谢所有引导我走向正确方向的评论。