2012-05-01 20 views
9

Tôi có một List<State> của State đối tượng tổ chức nào, và từng đối tượng State có bộ sưu tập của các đối tượng khác, chẳng hạn như Licenses, Taxes, Bonds, vvTại sao tôi nhận được một NullReferenceException trong System.Data.Entity.dll (Entity Framework)?

Ngoài ra còn có một bộ sưu tập cho ExpiredObjects, mà là một danh sách của bất kỳ đối tượng đó là đã hết hạn và cần được gia hạn. Vì lý do nào đó, tài sản này cho tôi một số NullReferenceException khi tôi thử và truy cập vào một tiểu bang cụ thể (Nevada), nhưng tôi không thể cho cuộc sống của tôi tìm ra cái thực sự là null vì tôi không thấy bất kỳ giá trị null nào bất cứ đâu.

Đây là mã của tôi để ném ngoại lệ. Nó lặp qua tất cả các tiểu bang và thêm tất cả các ExpiredObjects vào bộ sưu tập theo chế độ xem cụ thể được hiển thị. mã kiểm tra của tôi vẫn còn bao gồm

private List<ExpiredObject> LoadAllExpiredObjects() 
    { 
     var list = new List<ExpiredObject>(); 
     foreach (var state in States) 
     { 
      // This tells me the state is not null, and neither is state.ExpiredObjects 
      Debug.WriteLine(string.Format("{0}|{1}|{2}", 
       state.Name, state == null, state.ExpiredObjects == null)); 

      try 
      { 
       var x = state.ExpiredObjects; 
       Debug.WriteLine(x == null); 

       // Exception occurs on the "for" line on the Nevada state only 
       // Contents in for loop do not execute 
       foreach (var item in x) 
       { 
        Debug.WriteLine(string.Format("{0}", item)); 
        list.Add(item); 
       } 

       // This used to be the only line of code before I started testing 
       // It fails on Nevada 
       //list.AddRange(state.ExpiredObjects); 
      } 
      catch (Exception ex) 
      { 
       Debug.WriteLine(ex.Message); 
       Debug.WriteLine(ex.StackTrace); 
      } 
     } 
     return list; 
    } 

Các stack trace của lỗi là thế này:

A first chance exception of type 'System.NullReferenceException' occurred in System.Data.Entity.dll 
Object reference not set to an instance of an object. 
    at System.Data.EntityKey.AddHashValue(Int32 hashCode, Object keyValue) 
    at System.Data.EntityKey.GetHashCode() 
    at System.Collections.Generic.GenericEqualityComparer`1.GetHashCode(T obj) 
    at System.Collections.Generic.Dictionary`2.FindEntry(TKey key) 
    at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value) 
    at System.Data.Objects.ObjectStateManager.TryGetEntityEntry(EntityKey key, EntityEntry& entry) 
    at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet) 
    at lambda_method(Closure , Shaper) 
    at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper) 
    at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext() 
    at System.Data.Objects.DataClasses.RelatedEnd.Merge[TEntity](IEnumerable`1 collection, MergeOption mergeOption, Boolean setIsLoaded) 
    at System.Data.Objects.DataClasses.EntityCollection`1.Load(List`1 collection, MergeOption mergeOption) 
    at System.Data.Objects.DataClasses.EntityCollection`1.Load(MergeOption mergeOption) 
    at System.Data.Objects.DataClasses.RelatedEnd.Load() 
    at System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad() 
    at System.Data.Objects.DataClasses.EntityCollection`1.GetEnumerator() 
    at MyNamespace.StatesViewModel.LoadAllExpiredObjects() in C:\Users\me\Desktop\MySolution\StatesViewModel.cs:line 217 

Tôi cũng nhận được lỗi chính xác cùng khi tôi chọn Nevada và nó cố gắng để ràng buộc một DataGrid đến ExpiredObjects bộ sưu tập (nếu tôi nhận xét rằng ràng buộc, mã hoạt động tốt)

Có ai biết điều gì có thể gây ra lỗi này không?

+4

Nếu chỉ ở Nevada thì đó là vấn đề về dữ liệu, hãy kiểm tra kỹ lưỡng db. –

+1

@HenkHolterman Xin lỗi, tôi không chắc chắn thông tin nào có liên quan. Đó là db-đầu tiên. Tất cả các đối tượng ('State',' License', 'Tax', vv) có bảng cơ sở dữ liệu riêng của chúng với các khóa ngoài liên kết chúng. Họ cũng có khóa chính của họ, và không có gì được thừa hưởng. Tôi đang xem xét dữ liệu ngay bây giờ - không chắc chắn lý do tại sao tôi không nghĩ rằng để làm điều đó trước khi – Rachel

+2

@ HenkHolterman Bạn nói đúng, vấn đề nằm trong dữ liệu. Thủ tục mà tôi đã kéo các đối tượng hết hạn đã trả về giá trị 'null' cho một trong các trường được đánh dấu trong EF là không null, vì vậy bất cứ khi nào nó cố gắng lấy đối tượng đó từ cơ sở dữ liệu, nó sẽ ném một lỗi. Cảm ơn bạn và nếu bạn đăng câu trả lời đó, tôi sẽ chấp nhận nó :) – Rachel

Trả lời

14

Nếu chỉ dành cho Nevada thì đó phải là vấn đề về dữ liệu, hãy kiểm tra kỹ lưỡng trong db.

Và để tóm tắt, vấn đề cốt lõi là:

  • Đó là db-đầu tiên.
  • ... được trả lại một giá trị null cho một trong những lĩnh vực được đánh dấu trong EF như không null
+1

Cảm ơn bạn đã đăng câu trả lời này. Nó đã kết thúc giờ đầu đập ... – Deane

+0

oh người đàn ông, điều này đã mất một lúc để tìm nhưng nó đã gửi cho tôi đi đúng hướng.Tôi đã có cùng một lỗi, dữ liệu bảng của tôi là tốt, nhưng tôi đã có một đối tượng thực thể dựa trên một xem sql với một tham gia không đúng mà chèn một bản ghi null, giết chết toàn bộ điều. Cảm ơn đã giúp đỡ. +1 tất cả xung quanh. –

0

Tôi có cùng một vấn đề khi vô tình tải một mô-đun nhiều lần trong một kiến ​​trúc mô-đun.

Bổ sung, (các) Mô-đun trong đó sử dụng 2 bản sao của cùng một DbContext, cố gắng kết nối một Thực thể từ một Ngữ cảnh này sang Thực thể khác của Ngữ cảnh khác.

Mặt nạ này InvalidOperationException (không thể sử dụng Thực thể trong nhiều trình theo dõi), xảy ra bình thường mà không có nội dung mô-đun.

Mất 3 giờ để giải quyết, có thể giúp mọi người có cùng một vấn đề

Các vấn đề liên quan