簡體   English   中英

實體框架CodeFirst奇怪的NullReference

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM