[英]Entity Framework CodeFirst strange NullReference
我在向數據庫添加數據時有一個奇怪的nullreference。 在一個模型中,我有三個主要參考。 兩個鍵可以正常工作,但可以持續工作……例如,我的簡單代碼優先模型:
[Table("Users")]
public partial class User
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ClientId { get; set; }
[StringLength(60)]
public string ClientType { get; set; }
[StringLength(160)]
public string ClientName { get; set; }
public virtual ICollection<Repair> Repairs { get; set; }
public User()
{
Repairs = new List<Repair>();
}
}
[Table("Engineers")]
public partial class Engineer
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[StringLength(70)]
public string Name { get; set; }
public virtual ICollection<Repair> Repairs { get; set; }
public Engineer()
{
Repairs = new List<Repair>();
}
}
[Table("CurrentStatuses")]
public partial class CurrentStatus
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int StatusId { get; set; }
[StringLength(60)]
public string Status { get; set; }
public virtual ICollection<Repair> Repairs { get; set; }
public CurrentStatus()
{
Repairs = new List<Repair>();
}
}
一些數據已添加到用戶,工程師和CurrentStatuses。 在SQL Management Studio中一切正常! 這個表很愚蠢。 實體框架可以從該表中獲取數據,並將其存儲在DataGrid,ComboBox等中。下一個主表代碼優先模型:
[Table("Repairs")]
public partial class Repair
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
[Column(TypeName = "date")]
public DateTime Date { get; set; }
[StringLength(255)]
public string HardwareInfo { get; set; }
public virtual User User { get; set; }
public virtual Engineer Engineer { get; set; }
public virtual CurrentStatus CurrentStatus { get; set; }
[StringLength(140)]
public string Info { get; set; }
}
我要添加新的“修復”:1)獲取工程師:
public static async Task<ObservableCollection<Engineer>> GetAllEngineers()
{
using (var cntx = new ServiceDBContext())
{
ObservableCollection<Engineer> tmp = new ObservableCollection<Engineer>();
await (cntx.Engineers.Include(xx => xx.Repairs).ForEachAsync(new Action<object>((object obj) => { tmp.Add((Engineer)obj); })));
return tmp;
}
}
2)獲取用戶(對不起,偽代碼):public static async Task> GetAllUsers(){
using (var cntx = new ServiceDBContext())
{
ObservableCollection<User> tmp = new ObservableCollection<User>();
List<User> users = await cntx.Users.ToListAsync();
foreach (var itm in users)
{
tmp.Add(itm);
}
return tmp;
}
}
3)獲取當前狀態:
internal static async Task<ObservableCollection<CurrentStatus>> GetAllCurrentStatuses()
{
using (var cntx = new ServiceDBContext())
{
ObservableCollection<CurrentStatus> tmp = new ObservableCollection<CurrentStatus>();
await(cntx.CurrentStatuses.ForEachAsync(new Action<object>((object obj) => { tmp.Add((CurrentStatus)obj); })));
return tmp;
}
}
4)好! 我有所有數據要寫入新的“修復”(所有類型都可以)。
private void _addRepair()
{
FastRepair.Id = 2;
FastRepair.Date = SelectedDate;
FastRepair.User = SelectedUser;
...
FastRepair.CurrentStatus = SelectedStatus
using (ServiceDBContext cntx = new ServiceDBContext())
{
cntx.Users.Attach(FastRepair.User);
cntx.Engineers.Attach(FastRepair.Engineer);
cntx.CurrentStatuses.Attach(FastRepair.CurrentStatus);
cntx.Repairs.Attach(FastRepair);
cntx.Entry(FastRepair).State = EntityState.Added;
cntx.SaveChanges();
}
當我想再次獲取FastRepair.CurrentStatus時,我有NullReferenceException,在數據庫中的所有三列都有數字,數據庫有表的鍵。 SaveChanges()成功添加所有數據。 一切正常, 但是Entity僅在CurrentStatus處拋出NullReference (工程師,用戶表通過Inclusion等成功獲取)。
public static async Task<ObservableCollection<Repair>> GetFullRepairs()
{
using (var cntx = new ServiceDBContext())
{
ObservableCollection<Repair> tmp = new ObservableCollection<Repair>();
await (cntx.Repairs.Include(xx => xx.Engineer).Include(zz=> zz.CurrentStatus).Include(yy => yy.User).ForEachAsync(new Action<object>((object obj) => { tmp.Add((Repair)obj); })));
return tmp;
}
}
目前,LazyLoading已禁用,但沒有更改。
數據庫被刪除5次,重新編譯,谷歌無法正常工作。 :(也許有人可以幫助我!謝謝!
在每種方法中創建上下文並不是很明智。 看一下存儲庫模式,並通過依賴項注入來注入上下文。 您的代碼幾乎不可測試。 如果我看到針對這種功能的靜態方法,我個人會患上眼癌:-)
由於上下文不共享, 可能會產生后影響。 這里使用哪個EF版本? 6? 5? 有什么理由不對您的模式使用FluentAPI? 如果某些內容映射錯誤,則流利的符號可提供更多的錯誤功能和信息。
首先,此代碼是BAD。 不要使用靜態方法-使用存儲庫模式。 回答! 此代碼在GetFullRepairs()處出錯。 需要工作:
(((((cntx.Repairs.Include(ee=> ee.User)).Include(xx => xx.Engineer)).Include(yy => yy.RepairStatus))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.