【问题标题】:.Include not working on Entity Framework.包括不在实体框架上工作
【发布时间】:2012-06-19 13:17:29
【问题描述】:

我需要查询一个对象及其相关对象,我使用的是工作单元模式和存储库模式。

以下代码只返回主要对象,而不是相关的。

public List<EcoBonusRequest> GetAllRequestsWaitForPayment()
            {
                return _context.EcoBonusRequests.Where(p => p.CurrentStatus == RequestStatus.WaitingForPayment).Include("Dealer").Include("Vehicle").ToList();
            }

所以当我尝试在我的页面上使用该对象的经销商和车辆时,我得到一个空引用异常

public void Databind(EcoBonusRequest ecoBonusRequest)
        {
            if (ecoBonusRequest != null)
            {
                LblRegistrationNumberValue.Text = ecoBonusRequest.Dealer.Nuteres; ---> Exception here

存储库

public class UnitOfWork : IDisposable
    {
        #region Variables
            private readonly AskAndTrackContext _context = new AskAndTrackContext();
            private RequestBaseRepository _requestBaseRepository;
            private EcoBonusRequestRepository _ecobonusworkflowRepository;

 public RequestBaseRepository RequestBaseRepository
            {
                get
                {
                    return _requestBaseRepository ??
                            (_requestBaseRepository = new RequestBaseRepository(_context));
                }
            }

            public EcoBonusRequestRepository EcoBonusRequestRepository
            {
                get
                {
                    return _ecobonusworkflowRepository ??
                            (_ecobonusworkflowRepository = new EcoBonusRequestRepository(_context));
                }
            }

更新 1:实体

public class RequestBase
    {
        public int RequestBaseId { get; set; }
        public string CurrentStatus { get; set; }
        public string RequestNumber { get; set; }

        [Column(TypeName = "Date")]
        public DateTime RequestDate { get; set; }
        public bool IsOnHold { get; set; }

        public virtual Dealer Dealer { get; set; }
        public virtual Requester Requester { get; set; }
        public virtual Vehicle Vehicle { get; set; }

        public virtual ICollection<Attachment> Attachments { get; set; }
        public virtual ICollection<WorkflowHistory> WorkflowHistories { get; set; }


 public class EcoBonusRequest : RequestBase
    {
        public string BrandReturnedVehicle { get; set; }

        public string TypeReturnedVehicle { get; set; }

        public string ChassisReturnedVehicle { get; set; }

DbContext

public class AskAndTrackContext : DbContext
    {
        public AskAndTrackContext() : base("AskAndTrack")
        {
            //It doesnt create the database.
            //Database.SetInitializer<AskAndTrackContext>(null);
            //Database.SetInitializer<AskAndTrackContext>(new AskAndTrackDevInitializer());
        }

        public DbSet<RequestBase> RequestBases { get; set; }
        public DbSet<EcoBonusRequest> EcoBonusRequests { get; set; }

【问题讨论】:

  • 您能否编辑帖子并添加您如何实现存储库模式,您可能在那里忘记了一些东西。
  • 完成了,但是忘了说,RequestBase是父类,EcoBonusRequest是子类。
  • 那么 AskAndTrackContext 呢?这是最无聊的,因为您尝试在此 contxt 上使用 Include。
  • 刚刚添加到问题中
  • 你发现了吗?确切的解决方案是什么?

标签: c# linq entity-framework entity-framework-4.1


【解决方案1】:

嗯,Include 意味着被引用的实体将被预先加载。

但如果引用的实体可以为空(并且在您的查询中为 null),则查询将无法检索不存在的引用实体。

因此,如果 ecoBonusRequest.Dealer == null... 您将获得 NRE。

编辑:你能尝试这样测试吗?

public List<EcoBonusRequest> GetAllRequestsWaitForPayment()
            {
                var query = _context.EcoBonusRequests.Where(p => p.CurrentStatus == RequestStatus.WaitingForPayment).Include("Dealer").Include("Vehicle");
                var dealerExists = query.All(m => m.Dealer != null);
                return query.ToList();
            }

编辑 2

可能是继承和Include的问题 可以试试吗

return _context.RequestBase
               .Where(p => p.CurrentStatus == RequestStatus.WaitingForPayment)
               .Include("Dealer")
               .Include("Vehicle")
               .OfType<EcoBonusRequests>()
               .ToList();

【讨论】:

  • 我检查了数据库并且外键存在并且它指向一个有效的经销商记录。
  • @LuisEValencia 好的。你能看到编辑会发生什么吗? (dealerExists 上的调试点)
  • @LuisEValencia 可能是 EDIT 2 的解决方案
  • 请明天再查看这个帖子,如果需要我会更新它,现在得走了。
【解决方案2】:

尝试将包含移动到 where 之前,像这样

return _context.EcoBonusRequests.Include("Dealer").Include("Vehicle").Where(p => p.CurrentStatus == RequestStatus.WaitingForPayment).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多