C# 实体框架代码优先引用
我有一个奇怪的空引用,它将数据添加到我的数据库中。 我在一个模型中有三个关键参考。两个关键的工作完美,但最后。。。 例如,我的简单代码优先模型:C# 实体框架代码优先引用,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我有一个奇怪的空引用,它将数据添加到我的数据库中。 我在一个模型中有三个关键参考。两个关键的工作完美,但最后。。。 例如,我的简单代码优先模型: [Table("Users")] public partial class User { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ClientId { get; set; } [StringLength(60)] p
[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>();
}
}
我想添加新的“修复”:
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;
}
}
当我想再次获取FastRepair.CurrentStatus时,我有NullReferenceException,在数据库中所有三列都有数字,数据库有表的键。SaveChanges()成功添加所有数据。一切正常,但实体仅在当前状态下抛出NullReference(工程师、用户表成功地通过include和etc获取)
公共静态异步任务GetFullRepairs()
{
使用(var cntx=new ServiceDBContext())
{
ObservableCollection tmp=新的ObservableCollection();
wait(cntx.Repairs.Include(xx=>xx.Engineer).Include(zz=>zz.CurrentStatus).Include(yy=>yy.User).ForEachAsync(新操作((对象对象对象对象)=>{tmp.Add((修复)对象);}));
返回tmp;
}
}
此时LazyLoading已禁用,但没有更改
数据库被删除5次,重新编译,谷歌不工作:(
也许有人能帮我!
谢谢!在每个方法中创建上下文不是很明智。请查看存储库模式并通过依赖项注入注入上下文。您的代码几乎不可测试。就个人而言,如果我看到用于此功能的静态方法,我会患上眼癌:-) 这可能是一种后遗症,因为这种非共享环境。 这里使用的是哪个EF版本?6.5.
有没有理由不在您的模式中使用FluentAPI?如果映射错误,fluent表示法会提供更多错误功能和信息。首先,这段代码不好。 不要使用静态方法-使用存储库模式。 回答强> 此代码在GetFullRepairs()中有错误。工作需要:
(((((cntx.Repairs.Include(ee=> ee.User)).Include(xx => xx.Engineer)).Include(yy => yy.RepairStatus))
谢谢你的回答!EF 6.1.3。此代码来自第一步。:-)此时此刻,我正在阅读关于这种模式的信息,但我有一些愚蠢的问题。另外,我重用NuGet并用这么多的“(“我认为当前状态正在工作…:-|((((cntx.Repairs.Include(ee=>ee.User)).Include(xx=>xx.Engineer)).Include(yy=>yy.CurrentStatus))
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;
}
}
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;
}
}
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();
}
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;
}
}
(((((cntx.Repairs.Include(ee=> ee.User)).Include(xx => xx.Engineer)).Include(yy => yy.RepairStatus))