1

1 つのオブジェクトとその関連オブジェクトをクエリする必要があります。作業単位パターンとリポジトリ パターンを使用しています。

次のコードは、メイン オブジェクトのみを返しますが、関連するオブジェクトは返しません。

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

そのため、自分のページでそのオブジェクトの Dealer と Vehicle を使用しようとすると、null 参照例外が発生します

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));
                }
            }

Update1: エンティティ

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; }
4

2 に答える 2

2

インクルードは、参照されたエンティティが熱心に読み込まれることを意味します。

ただし、参照されるエンティティが null 許容 (およびクエリで 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

継承とインクルードの問題かもしれません

return _context.RequestBase
               .Where(p => p.CurrentStatus == RequestStatus.WaitingForPayment)
               .Include("Dealer")
               .Include("Vehicle")
               .OfType<EcoBonusRequests>()
               .ToList();
于 2012-06-19T13:22:05.393 に答える
1

このように、インクルードを where の前に移動してみてください

return _context.EcoBonusRequests.Include("Dealer").Include("Vehicle").Where(p => p.CurrentStatus == RequestStatus.WaitingForPayment).ToList();
于 2012-06-19T13:21:47.437 に答える