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?
Nếu chỉ ở Nevada thì đó là vấn đề về dữ liệu, hãy kiểm tra kỹ lưỡng db. –
@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
@ 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