在数据库中设置所有标志的快速方法?

时间:2016-10-10 22:01:06

标签: c# .net entity-framework

我正在寻找一种快速的方法来设置表中的所有标志,所以我尝试了这个:

        TextSelection selection = (TextSelection)typeof(PasswordBox).GetProperty("Selection", BindingFlags.Instance | BindingFlags.NonPublic).GetMethod.Invoke(textBox, null);

        Type tTextRange = selection.GetType().GetInterfaces().Where(x => x.Name == "ITextRange").FirstOrDefault();

        object oStart = tTextRange.GetProperty("Start").GetMethod.Invoke(selection, null);
        object oEnd = tTextRange.GetProperty("End").GetMethod.Invoke(selection, null);

        MethodInfo mi = oStart.GetType().GetProperty("Offset", BindingFlags.Instance | BindingFlags.NonPublic).GetMethod;

        int nStart = (int)mi.Invoke(oStart, null);
        int nEnd = (int)mi.Invoke(oEnd, null);

        System.Diagnostics.Debug.WriteLine(nStart + " ==> " + nEnd);

但是这不起作用,它给出了错误:

  

“在此前提下开始第二次操作   异步操作完成。使用'await'确保任何   在调用另一个方法之前已完成异步操作   在这种背景下。任何实例成员都不能保证是线程   安全“。

我很确定我以前做过非常类似的事情并且工作正常。这种方法可以起作用吗?

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

执行您要实现的目标的最佳方法之一是使用Entity Framework Extended Library

  db.Companies
    .Where(x => x.CheckedCompaniesHouse == true)
    .Update(t => new Company { CheckedCompaniesHouse = false });

使用此库可以避免将要修改的实体加载到内存中。我上面显示的代码将被转换为sql更新批处理。

答案 1 :(得分:0)

你试过这个吗?

db.YourTable.Where(x => x.TheId == TheParameterId && x.AnotherColumn == true).ToList().ForEach(x =>
{
    x.IsActive = false; x.UpdatedTimeStamp = DateTime.Now;
});
db.SaveChanges();

我不知道是否有一种简单的方法可以做到这一点,没有扩展和其他库。

但EF并不是很好,有多个这样的更新,为什么不试试Dapper呢?

还有异步方法。

你可以使用简单的ADO.NET和SQL来实现它。

类似的东西:

connection.Execute("UPDATE Table SET Field = NewValue WHERE Column = @Parameter", new { Parameter = someParameterValue }); 

https://github.com/StackExchange/dapper-dot-net