以下情况:
我有一个为零件创建机器程序的服务器。我的基础架构看起来如下:
- Willydemandes:请求为零件创建程序
- Willymachines(FK与Willydemandes有关(:每个机器程序为此部分创建。
- Willyresults(与FK的Willymachines有关(:每个警告,结果,机器的输出。
服务器将第一个Willydemandes拉动处理:
static public WillyDemandes GetFirst()
{
WillyDemandes willyDemandes;
using (Info_IndusContext db = new Info_IndusContext())
{
willyDemandes = db.WillyDemandes
.Include(x => x.IdPartNavigation)
.Where(x => x.Statut == Statuts.EnTest.ToString() && x.Username == Environment.UserName)
.OrderBy(x => x.Priority)
.ThenBy(x => x.Id)
.FirstOrDefault();
if (willyDemandes != null)
{
willyDemandes.Statut = Statuts.EnTraitement.ToString();
willyDemandes.ServerName = Environment.MachineName;
willyDemandes.DateDebut = DateTime.Now;
db.SaveChanges();
}
}
return willyDemandes;
}
然后,服务器向零件(Willydemandes的新的Willymachines(添加了一台新计算机
static public WillyMachines Create(WillyDemandes willyDemandes, string MachineName)
{
using (Info_IndusContext db = new Info_IndusContext())
{
WillyMachines willyMachines = willyDemandes.WillyMachines.Where(x => x.DocumentType == MachineName).FirstOrDefault();
if (willyMachines == null)
{
willyMachines = new WillyMachines() { IdDemande = willyDemandes.Id, DocumentType = MachineName };
willyDemandes.WillyMachines.Add(willyMachines);
}
willyMachines.DateDebut = DateTime.Now;
willyMachines.DateFin = null;
willyMachines.Performance = null;
willyMachines.Statut = Statuts.EnTraitement.ToString();
db.SaveChanges();
return willyMachines;
}
}
问题是,每当我执行先前的代码时,Savechanges都说上下文没有改变,Willymachines的ID保持在0,而不是抓住DB应该给他的增量ID。因此,我将以下补丁作为解决方法(添加到上下文。WillyMachines而不是导航属性和刷新Willydemandes(
static public WillyMachines Create(WillyDemandes willyDemandes, string MachineName)
{
using (Info_IndusContext db = new Info_IndusContext())
{
WillyMachines willyMachines = willyDemandes.WillyMachines.Where(x => x.DocumentType == MachineName).FirstOrDefault();
if (willyMachines == null)
{
willyMachines = new WillyMachines() { IdDemande = willyDemandes.Id, DocumentType = MachineName };
db.WillyMachines.Add(willyMachines);
}
willyMachines.DateDebut = DateTime.Now;
willyMachines.DateFin = null;
willyMachines.Performance = null;
willyMachines.Statut = Statuts.EnTraitement.ToString();
db.SaveChanges();
willyDemandes = WillyDemandesController.Refresh(willyDemandes);
return willyMachines;
}
}
static public WillyDemandes Refresh(WillyDemandes willyDemandes)
{
using (Info_IndusContext db = new Info_IndusContext())
{
return db.WillyDemandes
.Include(x => x.IdPartNavigation)
.Include(x => x.WillyMachines).ThenInclude(x => x.WillyResults)
.Where(x => x.Id == willyDemandes.Id)
.FirstOrDefault();
}
}
为什么我的上下文看不到对Willydemandes的更改?我应该事先将willydemandes附加到上下文上吗?我应该去别的东西吗?我的解决方案可行吗?
谢谢
在第一种情况下,没有将对象添加到上下文中。willyDemandes
只是一个变量,如果找不到记录,则包含null
。将变量设置为某些东西不会修改除了存储在该内存位置的指针以外的任何内容。
第一个片段等效于:
WillyMachines willyMachines = willyDemandes.WillyMachines
.Where(x => x.DocumentType == MachineName)
.FirstOrDefault();
if (willyMachines == null)
{
var otherMachines = new WillyMachines{
IdDemande = willyDemandes.Id,
DocumentType = MachineName
WillyMachines.Add(willyMachines);
DateDebut = DateTime.Now;
DateFin = null;
Performance = null;
Statut = Statuts.EnTraitement.ToString()
};
}
db.SaveChanges();
应使用db.WillyMachines.Add(willyMachines);
: