大佬们帮忙看看可好 在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时

正人君子! 2020-07-10 10:30:54
下面是代码:


await wc.IsWPName(hs);

public async Task IsWPName(HashSet<string> hs)
{
using (var wcSelvice = new DAL.WorkCenterSelvice())
{
//分离出工作中心
List<string> wcName = new List<string>();
//分离出工序
List<string> wpName = new List<string>();
foreach (var item in hs)
{
string[] s = item.Split(',');
wcName.Add(s[0]);
wpName.Add(s[1]);
}
//转换工序ID
List<int> wpID = new List<int>();
using (var wpSelvice = new DAL.WP_TableSelvice())
{
foreach (var item in wpName)
{
wpID.Add(wpSelvice.GetAllWhere(w => w.WP_Name == item).Select(s => s.Id).FirstOrDefault());
}
}
//判断工作中心中是否存在该工序 若不存在则添加
for (int i = 0; i < wcName.Count; i++)
{
string wcNamestr = wcName[i];
//得到工作中心数据
var wcS = wcSelvice.GetWhere(w => w.WCName == wcNamestr).FirstOrDefault();
////查询时已经用到AsNoTracking()
string temps = wcS.WPID;
// wcS.WPID = "1,2,3,4,5,6";
//判断是否为空wpID
if (wcS.WPID == null)
{
wcS.WPID = wpID[i] + ",";
}
else
{
bool bo = true;
//分离出工作中心的工序 判断此次添加的工序是否存在
string[] st = temps.Split(',');
for (int j = 0; j < st.Length; j++)
{
if (st[j] == "") continue;
else
{
if (st[j] == wpID[i].ToString())
{
bo = false;
break;
}
}
}
//添加的工序不存在该工作中心
if (bo)
{
string tempwp = temps + wpID[i] + ",";
wcS.WPID = tempwp;
}
else
{
continue;
}
}
//修改
await wcSelvice.EditAsync(wcS, true);
}

}
}

当数据库WPID字段Wie空时可以修改成功 但是一旦有数据了就失败了
但是第二次运行程序它可以走过第一次错的数据 然后下一段数据继续报错

public async Task EditAsync(T t, bool saved = true) //异步操作
{
DbContext.Configuration.ValidateOnSaveEnabled = false; //关闭校验
DbContext.Entry(t).State = System.Data.Entity.EntityState.Modified;
if (saved)
{
await DbContext.SaveChangesAsync();
DbContext.Configuration.ValidateOnSaveEnabled = true; //关闭校验
}
}





...全文
438 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2020-07-10
  • 打赏
  • 举报
回复
引用 3 楼 浮沉! 的回复:
[quote=引用 2 楼 正怒月神 的回复:]试试看

DbContext.Set<T>().Attach(wcS);
await DbContext.SaveChangesAsync();
哥 不行 还是同样的错误[/quote] 在上一步的基础上。继续尝试 wcSelvice.GetWhere(w => w.WCName == wcNamestr).FirstOrDefault(); 改为 wcSelvice.GetWhere(w => w.WCName == wcNamestr).AsNoTracking().FirstOrDefault();
正人君子! 2020-07-10
  • 打赏
  • 举报
回复
public async Task EditAsync(T t, bool saved = true) //异步操作 { DbContext.Configuration.ValidateOnSaveEnabled = false; //关闭校验 DbContext.Entry(t).State = System.Data.Entity.EntityState.Modified; if (saved) { await DbContext.SaveChangesAsync(); DbContext.Configuration.ValidateOnSaveEnabled = true; //关闭校验 } } 错误是在这一步出错
正人君子! 2020-07-10
  • 打赏
  • 举报
回复
引用 2 楼 正怒月神 的回复:
试试看

DbContext.Set<T>().Attach(wcS);
await DbContext.SaveChangesAsync();
哥 不行 还是同样的错误
正怒月神 2020-07-10
  • 打赏
  • 举报
回复
试试看

DbContext.Set<T>().Attach(wcS);
await DbContext.SaveChangesAsync();
正人君子! 2020-07-10
  • 打赏
  • 举报
回复
正人君子! 2020-07-10
  • 打赏
  • 举报
回复
引用 5 楼 正怒月神 的回复:
[quote=引用 3 楼 浮沉! 的回复:][quote=引用 2 楼 正怒月神 的回复:]试试看

DbContext.Set<T>().Attach(wcS);
await DbContext.SaveChangesAsync();
哥 不行 还是同样的错误[/quote] 在上一步的基础上。继续尝试 wcSelvice.GetWhere(w => w.WCName == wcNamestr).FirstOrDefault(); 改为 wcSelvice.GetWhere(w => w.WCName == wcNamestr).AsNoTracking().FirstOrDefault(); [/quote] 哥 我找到一个函数 已经解决了 谢谢 下面是解决我这个问题的函数 //直接查找上下文中是否存在此实体,如果存在则移除,然后再进行操作,此方法在大部分情况下有效。 public bool Exists(T entity) { ObjectContext _ObjContext = ((IObjectContextAdapter)DbContext).ObjectContext; ObjectSet<T> _ObjSet = _ObjContext.CreateObjectSet<T>(); var entityKey = _ObjContext.CreateEntityKey(_ObjSet.EntitySet.Name, entity); Object foundEntity; var exists = _ObjContext.TryGetObjectByKey(entityKey, out foundEntity); // TryGetObjectByKey attaches a found entity // Detach it here to prevent side-effects if (exists) { _ObjContext.Detach(foundEntity); } return (exists); }
正人君子! 2020-07-10
  • 打赏
  • 举报
回复
这是初始 Id WCName WPID CreatTime IsRemoved 1 抛光车间 NULL 2020-07-10 10:22:55.243 0 2 检验部 NULL 2020-07-10 10:22:55.267 0 3 丰源电镀车间 NULL 2020-07-10 10:22:55.283 0 4 喷漆车间 NULL 2020-07-10 10:22:55.317 0 5 包装车间 NULL 2020-07-10 10:22:55.347 0 6 采购部 NULL 2020-07-10 10:22:55.470 0 7 冲床车间 NULL 2020-07-10 10:22:55.487 0 8 压铸车间 NULL 2020-07-10 10:22:55.537 0 9 精工车间 NULL 2020-07-10 10:22:55.567 0 10 外协车间 NULL 2020-07-10 10:22:55.587 0 这是第一次运行情况 Id WCName WPID CreatTime IsRemoved 1 抛光车间 1, 2020-07-10 10:22:55.243 0 2 检验部 2, 2020-07-10 10:22:55.267 0 3 丰源电镀车间 3, 2020-07-10 10:22:55.283 0 4 喷漆车间 NULL 2020-07-10 10:22:55.317 0 5 包装车间 NULL 2020-07-10 10:22:55.347 0 6 采购部 NULL 2020-07-10 10:22:55.470 0 7 冲床车间 NULL 2020-07-10 10:22:55.487 0 8 压铸车间 NULL 2020-07-10 10:22:55.537 0 9 精工车间 NULL 2020-07-10 10:22:55.567 0 10 外协车间 NULL 2020-07-10 10:22:55.587 0 这是第二次 Id WCName WPID CreatTime IsRemoved 1 抛光车间 1,4, 2020-07-10 10:22:55.243 0 2 检验部 2,6, 2020-07-10 10:22:55.267 0 3 丰源电镀车间 3, 2020-07-10 10:22:55.283 0 4 喷漆车间 5, 2020-07-10 10:22:55.317 0 5 包装车间 7, 2020-07-10 10:22:55.347 0 6 采购部 8, 2020-07-10 10:22:55.470 0 7 冲床车间 9, 2020-07-10 10:22:55.487 0 8 压铸车间 NULL 2020-07-10 10:22:55.537 0 9 精工车间 NULL 2020-07-10 10:22:55.567 0 10 外协车间 NULL 2020-07-10 10:22:55.587 0
正人君子! 2020-07-10
  • 打赏
  • 举报
回复
引用 5 楼 正怒月神 的回复:
[quote=引用 3 楼 浮沉! 的回复:][quote=引用 2 楼 正怒月神 的回复:]试试看

DbContext.Set<T>().Attach(wcS);
await DbContext.SaveChangesAsync();
哥 不行 还是同样的错误[/quote] 在上一步的基础上。继续尝试 wcSelvice.GetWhere(w => w.WCName == wcNamestr).FirstOrDefault(); 改为 wcSelvice.GetWhere(w => w.WCName == wcNamestr).AsNoTracking().FirstOrDefault(); [/quote] 哥 还是没变化 头疼 如果我要修改的这一列为null是可以修改成功的 但是一旦我要修改的这一列不为null就出现这种情况 然后我再次运行程序 它就会走过上次报错的数据 直到再次遇到不为空的数据继续报错

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧