在数据库优先的场景中使用DbContext时,我发现与ObjectContext相比,添加和删除实体的速度非常慢.如果添加2000个实体并在最后保存更改,DbContext比ObjectContext慢3到5倍(顺便说一句:我知道使用SqlBulkCopy添加大量实体会更好,但这不是重点).如果在每次添加后保存更改,DbContext仍然慢近两倍.当涉及删除时,它甚至变得更糟:当在所有实体删除结束时保存时,DbContext比ObjectContext慢大约18倍.
我使用了我用来比较数据库访问技术和小型控制台应用程序的高度开发的测试应用程序来进行双重检查.两者都显示使用DbContext添加和删除实体的结果不佳.以下是控制台应用程序的结果:
Inserting 2000 entities via DbContext saving changes at the end: 2164ms
Inserting 2000 entities via ObjectContext saving changes at the end: 457ms
Inserting 2000 entities via DbContext saving changes after each object addition: 8420ms
Inserting 2000 entities via ObjectContext saving changes after each object adding: 4857ms
Inserting 2000 entities via DbContext using a new DbContext for each object addition: 4018ms
Deleting 2000 entities via DbContext saving changes at the end: 4794ms
Deleting 2000 entities via ObjectContext saving changes …Run Code Online (Sandbox Code Playgroud) 我试图找到使用SqlBulkCopy与SqlBulkCopyOptions.UseInternalTransaction复制选项和没有它之间的区别,但在我的测试应用程序中,我没有发现任何差异.如果BatchSize是例如0并且我添加了100条记录(在a中DataTable),其中记录号50在将其添加到数据库表时导致错误,我在表中得到0条记录.BatchSize例如,如果设置为10,则会获得40条记录(4批10条记录,第5批包含错误记录并导致批量复制中止).如果qlBulkCopyOptions.UseInternalTransaction设置了S无关紧要,我总能得到相同的结果.看起来批次总是复制在内部事务中.
如果您对我的测试应用程序感兴趣,那么它是:SqlBulkCopy-Error-and-Transaction-Test.zip
我的问题是:
SqlBulkCopyOptions.UseInternalTransaction过时因为SqlBulkCopy总是使用内部交易?希望有人能澄清一下
编辑:
根据答案和评论我认为我的问题不够明确.我知道文档.它说"默认情况下,批量复制操作是它自己的事务." 并且每个批次在传递时都使用它自己的事务UseInternalTransaction.但是,如果这意味着默认情况下,批量复制操作仅对整个批量复制使用一个事务(而不是每个批次一个),如果我将BatchSize设置为特定大小并且后面的批处理,则不会在数据库中获取记录第一个导致错误.如果仅使用一个事务,则将回滚添加到事务日志中的所有记录.但是我得到了包含错误记录的批次之前的批次记录.根据这一点,似乎默认情况下每个批次都在它自己的事务中执行.这意味着我是否通过没有任何区别UseInternalTransaction.如果我走错了路,我真的很感激,如果有人能澄清的话.
一个事实可能很重要:我使用的是SQL Server 2012.也许SQL Server 2008的行为有所不同.我会检查一下.
编辑:感谢usr的回复,我想我找到了答案:我调试了一下,发现如果没有定义UseInternalTransaction,私有字段_internalTransaction真的没有设置.然后,SqlBulkCopy不使用自己的(内部)事务.但是分析表明SqlBulkCopy使用TDS(表格数据流)来复制数据(无论BatchSize是什么).我没有找到关于TDS的更多信息,特别是对于SQL Server,但我假设SQL Server在内部事务中执行TDS批量复制操作.因此,对于SQL Server来说,UseInternalTransaction似乎是多余的,但为了安全起见,我会设置它.
当使用Background Transfer API时,我们必须迭代当前数据传输以在应用程序重新启动(即系统关闭)后重新启动它们.要获取进度信息并能够取消数据传输,必须使用AttachAsync附加它们.
我的问题是AttachAsync仅在数据传输完成时返回.这在某些情况下是有道理的.但是,当进行多次数据传输时,列表中的下一次传输将不会在当前连接完成之前启动.我对这个问题的解决方案是处理AttachAsync()的任务.AsTask()以经典的方式返回(不使用await而是continuation):
IReadOnlyList<DownloadOperation> currentDownloads =
await BackgroundDownloader.GetCurrentDownloadsAsync();
foreach (var downloadOperation in currentDownloads)
{
Task task = downloadOperation.AttachAsync().AsTask();
DownloadOperation operation = downloadOperation;
task.ContinueWith(_ =>
{
// Handle success
...
}, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion,
TaskScheduler.FromCurrentSynchronizationContext());
task.ContinueWith(_ =>
{
// Handle cancellation
...
}, CancellationToken.None, TaskContinuationOptions.OnlyOnCanceled,
TaskScheduler.FromCurrentSynchronizationContext());
task.ContinueWith(t =>
{
// Handle errors
...
}, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted,
TaskScheduler.FromCurrentSynchronizationContext());
}
Run Code Online (Sandbox Code Playgroud)
它有点工作(在实际的代码中我将下载添加到ListBox).循环遍历所有下载并执行StartAsync.但下载并非真正同时启动.每次只有一个运行,只有当它完成后,下一个继续运行.
解决这个问题的任何方法?
使用上索布文化(hsb),转换为字符串的DateTime对象使用格式"d.M.yyyyH.mm.ss'hodź.'".例如ToString("G")返回"31. 12. 20115.06.07hodź." 2011年12月31日上午05:06:07
问题是尝试将这样的字符串转换回DateTime不会导致true.甚至更简单的字符串如"1. 1. 2011"或"1.1.2011"也没有成功.并且万一有人建议在转换/坚持时传递文化:我当然这样做了.
尝试解析"1.2.3"会导致当前日期的时间为01:02:03.
我认为这是一个错误.或者有人知道可能出现什么问题吗?
我在Windows 8 RTM计算机上使用.NET 4.5 RTM.
样品:
DateTime date = DateTime.Now;
CultureInfo culture = new CultureInfo("hsb");
string dateString = date.ToString("G", culture);
DateTime convertedDate;
bool dateOkay = DateTime.TryParse(dateString, culture,
DateTimeStyles.AllowInnerWhite, out convertedDate);
Console.WriteLine(dateOkay);
// This results false although the date string was read by
// ToString("G") (i.e. '20. 9. 2012 12.28.10 hod?.') and should be okay
dateString = "1. 1. 2000";
dateOkay = DateTime.TryParse(dateString, culture,
DateTimeStyles.AllowInnerWhite, out convertedDate);
Console.WriteLine(dateOkay);
// This results in …Run Code Online (Sandbox Code Playgroud) 如果Windows运行时类型引发COM错误.NET似乎经常(或总是?)将此错误包装到Exception实例中.错误消息包含COM HRESULT错误代码.例如,当使用带有AES-CBC的新Cryptographic API时,错误的缓冲区长度会导致Exception消息"提供的用户缓冲区对请求的操作无效.(Exception from HRESULT: 0x800706F8)".
那么,我们应该如何处理这些例外?我们是否应该HRESULT从异常中读取代码以了解哪种异常是什么?在经典的.NET中CryptographicException,我可以使用它来区分加密错误和其他错误.
我不明白的另一件事是Microsoft代码质量规则规定一个人永远不应该抛出Exception但总是派生类型.原因是没有人应该被迫抓住Exception那些捕获更多致命异常的将军OutOfMemoryException.另一个规则是,人们永远不应该Exceptio在图书馆中捕获n.如果我们被迫Exception在Windows应用商店应用或WinRT库中捕获,我们怎么能遵循这些策略?
顺便说一下:克莱门斯·沃斯特斯在他的博客中展示了我们如何捕捉异常,同时避免捕获致命异常.我认为捕获Exception不再是糟糕的代码.
在用于Windows应用商店应用的.NET API中,缺少SecureString类.PasswordBox也不会将密码存储在安全字符串中.什么相当于在Windows应用商店应用中安全地存储字符串?或者Windows 8有一些安全的机制来阻止他人读取应用程序的内存(或故意崩溃后的内存转储)
我正在使用TeamCity 7.1.我想获得一个列表,其中包括当前未运行的每个构建配置(构建类型)的最后一个构建.我发现了这个问题:TeamCity - 如何通过rest api获得每个项目最后完成的构建列表?但答案中的REST URI对我不起作用.
<teamcity-server>/httpAuth/app/rest/builds?locator=sinceBuild:(status:failure)
Run Code Online (Sandbox Code Playgroud)
似乎工作,并给我所有在失败之前成功的构建.
但恰恰相反
<teamcity-server>/httpAuth/app/rest/builds?locator=sinceBuild:(status:success)
Run Code Online (Sandbox Code Playgroud)
不返回任何构建.
我知道我可以获得所有构建类型,迭代它们并使用获得最新完成的构建
<teamcity-server>/httpAuth/app/rest/buildTypes/id:<build-type-id>/builds/running:false?count=1&start=0
Run Code Online (Sandbox Code Playgroud)
("count = 1&start = 0"可能没有必要)但我不确定我得到的是最新版本.此外,这需要对所有构建类型进行许多REST调用.一个简洁的解决方案只使用一个REST调用.
有任何想法吗?
我(作为一个非Java类型的人)很困惑我的本地JRE 10安装需要更新,但更新时,我得到JRE 8!这甚至在https://java.com/en/download/more_info10.jsp上报告:
安装了JRE 9和/或JRE 10(非长期支持版本)的用户应该删除那些过时的Java版本.
我会理解JRE 11是否是当前版本,但不是,它是JRE 8:
如果您仍需要在计算机上安装Java,请下载java.com上提供的最新版本的JRE 8,这是目前唯一支持Java目标桌面部署的主要版本.
怎么会这样?
要使用实体框架实现域驱动设计,我使用Julie Lerman在TechEd North America 2013上提出的方法(http://channel9.msdn.com/Events/TechEd/NorthAmerica/2013/DEV-B336#fbid=4tnuPF6L-Jc).此方法使用EF实体类作为域类.对于不同的有界上下文,域实体类具有不同的属性,甚至可以有不同的名称,尽管它们将数据存储在同一个表中.示例是"客户服务"有界上下文中的客户,实际上是"客户",但在"发货"有界上下文中,他是仅具有客户属性子集的"收件人".对于每个有界上下文,存在不同的EF上下文,其仅包括有界上下文所需的实体的DbSet.通过重写OnModelCreating,我们甚至可以排除与有界上下文无关的引用实体.使用POCO可以很容易地实现这一部分.
问题是使用Code First时的数据库创建.如果我们让Code First为每个不同的EF上下文创建数据库,我们最终会得到几个数据库.如果我们在EF上下文的构造函数中定义数据库名称,则使用第一个使用的EF上下文创建数据库,并在使用第二个EF上下文时丢失InvalidOperationException(说模型已更改)(缺少实体,缺少属性等).如果使用的EF上下文在使用之前使用其他EF上下文的实体/成员,我们可能会使用迁移来更新数据库.但是,这肯定会与正常使用迁移相混淆,并且无法正常运行.作为临时解决方案,我仅使用单独的EF上下文来创建数据库.这意味着我必须再次为此目的实现所有EF实体.
我相信还有其他解决方案.所以,请(朱莉)告诉我们如何.
我正在尝试在package.json中添加一个npm脚本,该脚本NODE_ENV在进行其他操作(如运行webpack)之前进行设置。但是,尽管语法似乎是正确的,NODE_ENV在Windows 10下运行时未设置。
测试脚本
"scripts": {
"test": "SET NODE_ENV=debug && echo %NODE_ENV%" }
Run Code Online (Sandbox Code Playgroud)
结果来自npm run test“生产”(NODE_ENV运行脚本之前已设置为“生产”)。应该是“调试”。
编辑
为了澄清我的问题:我无法在Windows 10下设置任何环境变量。我需要调用SET,因为我正在Windows(10)下运行脚本。似乎是一些权限问题(不允许脚本设置环境变量?)。
另一个(或实际的)问题是:如何创建一个脚本(使用Webpack)以创建JavaScript文件的缩小版本(用于生产),以及如何创建非缩小版本的脚本(用于开发)。到目前为止,我使用以下方法(有关重要部分,请参见注释):
编辑2
我现在并没有意识到这可能会有所作为,但万一确实如此:我使用的是使用create-react-app创建的React应用。我找到了问题的答案,请参见下文。
package.json:
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
// Scipts for build for development and for production
"build-dev": "SET NODE_ENV=debug webpack",
"build-release": "SET NODE_ENV=production webpack"
},
"author": "",
"license": "ISC",
"dependencies": {
"babel-core": "^6.24.1",
"babel-loader": "^7.0.0",
"babel-preset-env": "^1.4.0",
"babel-preset-react": …Run Code Online (Sandbox Code Playgroud) 在适用于Windows应用商店的.NET API中,DateTimeFormatInfo不包含DateSeparator和TimeSeparator属性.原因可能是两者都允许在完整的API中进行设置.但是,如果我需要获取当前日期或时间分隔符(我这样做),我可以使用什么呢?
根据文档,在Windows应用商店应用中,我只能在应用设置中存储WinRT类型.对于应该保持在一起的漫游设置,我可以使用ApplicationDataCompositeValue.尝试存储自己的类或结构的实例会导致异常,并显示消息"WinRT信息:尝试序列化要写入应用程序数据存储的值时出错.附加信息:不支持此类型的数据".术语"尝试序列化"表示必须有某种方式来序列化应用程序数据API的类型.
有谁知道我怎么能做到这一点?
我尝试过DataContract序列化,但它没有用.
当我通过REST API处理付款时(使用PayPal REST SDK for .NET),我首先创建付款
Payment payment = ...
Payment createdPayment = payment.Create(apiContext);
Run Code Online (Sandbox Code Playgroud)
我存储创建的付款的ID以供以后使用.然后我重定向到提供的付款页面.在PayPal用户批准付款后调用的页面中,我想获取有关付款的信息.
我打电话
Payment payment = Payment.Get(apiContext, paymentID);
Run Code Online (Sandbox Code Playgroud)
使用存储的付款ID.
我预计这里的付款状态"已经批准",但它仍然是"已创建".
可能有什么不对?何时或如何获得"批准"状态?