2016-01-17 5 views
1

У меня странная нулевая ссылка с добавлением данных в мою БД. У меня есть три ключевых ссылки в одной модели. Два ключевых работают отлично, но последние ... Например мой простой код, первые модели:Entity Framework CodeFirst странный 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 все в порядке! Эти таблицы тупо просты. Entity структура может получить данные из этого таблиц, храните его в 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) Fetch Инженеры:

 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) Выборка пользователей (извините за фиктивный код): общественности статические асинхронной задачи> 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) Fetch CurrentStatuses:

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

И у меня есть NullReferenceException, когда хотите снова получать FastRepair.CurrentStatus, в базе данных все три колонки имеют цифры, базы данных имеют ключи таблиц. SaveChanges() успешно добавляет все данные. Все в порядке, , но Entity throw NullReference только на CurrentStatus (Инженер, таблицы пользователей успешно загружаются с включением и т. Д.).

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 раз, перекомпилировано, Google не работает. :( Может быть, кто-то может мне помочь! Спасибо!

ответ

1

Это не очень умно, чтобы создать контекст, в каждом методе. Посмотрите на хранилище шаблона и ввести контекст с помощью инъекции зависимостей. You кода почти не проверяем Лично я получаю рак глаз, если вижу статические методы для этой функции :-)

Это может быть afteraffect из-за этого не общего контекста. Какая версия EF используется здесь? 6? 5? Любые причины не использовать FluentAPI для вашей схемы? Свободная нотация дает больше ошибок и информации, если что-то неправильно отображается.

+0

благодарит за ответом! EF 6.1.3. Этот код с первых шагов. :-) В этот момент я читаю информацию об этом шаблоне, но имею эти глупые вопросы. P.SI повторно использует NuGet и заменяет код так много »(« CurrentStatus working i think ...: - | ((((cntx.Repairs.Include (ee => ee.User)). Включить (xx => xx.Engineer)). Включить (yy => yy.CurrentStatus)) – user1576474

0

Во-первых, этот код НЕОБХОДИМО. Не используйте статические методы - используйте шаблон репозитория. Ответ! Этот код имеет ошибку в GetFullRepairs(). Необходимость в работе:

(((((cntx.Repairs.Include(ee=> ee.User)).Include(xx => xx.Engineer)).Include(yy => yy.RepairStatus)) 
Смежные вопросы