C# db.SaveChanges()爆炸并出现事务异常
以下方法导致第一个C# db.SaveChanges()爆炸并出现事务异常,c#,asp.net,sql,linq,C#,Asp.net,Sql,Linq,以下方法导致第一个db.SaveChanges()引发异常: (由于会话中正在运行其他线程,因此不允许新事务。) 第一个db.SaveChanges()是确保不再插入同名的新产品 我如何解决这个问题?提前谢谢 为我工作: 谢谢。不知道为什么会发生这种情况,但是如果您还检查了db.dlc\u产品的Local集合,则不需要第一个SaveChanges(): foreach (var product in dlc_products.ToList()) { var dlc_product = db
db.SaveChanges()
引发异常:
(由于会话中正在运行其他线程,因此不允许新事务。)
第一个db.SaveChanges()
是确保不再插入同名的新产品
我如何解决这个问题?提前谢谢
为我工作:
谢谢。不知道为什么会发生这种情况,但是如果您还检查了
db.dlc\u产品的Local
集合,则不需要第一个SaveChanges()
:
foreach (var product in dlc_products.ToList())
{
var dlc_product = db.dlc_Products.SingleOrDefault(p => p.name == product.name)
?? db.dlc_Products.Local.SingleOrDefault(p => p.name == product.name);
...
}
新对象将添加到本地
集合
请注意,db.dlc\u Products.Join(db.dlc\u Products.Local)
看起来效率更高,但它不会编译,相反,它会为每个调用查询整个db.dlc\u产品。
。我认为它更像是通过返回IEnumerable来区分的。。。只要说‘为什么不调用一次SaveChanges()
,让数据库处理重复的名称。我该如何让数据库处理重复的名称呢?这不也会返回异常吗?我不确定。很好,我试图找到一种方法在本地检查它,而不是点击数据库,从来都不知道Local
的存在。现在将重试。好的,这是ObjectContext,没有DbContext。在ObjectContext中查询本地对象有点困难。如何做到这一点,请参见段落DbSet.Local。当然,您也可以简单地使用list对象来存储迄今为止添加的新产品。
var Local = db.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added)
.Where(es => es.Entity is dlc_Product).Select(es => es.Entity as dlc_Product);
var dlc_product = db.dlc_Products.SingleOrDefault(p => p.name == product.name)
?? Local.SingleOrDefault(p => p.name == product.name);
foreach (var product in dlc_products.ToList())
{
var dlc_product = db.dlc_Products.SingleOrDefault(p => p.name == product.name)
?? db.dlc_Products.Local.SingleOrDefault(p => p.name == product.name);
...
}