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