Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
jobily
Efcore.Pg
提交
153db6e5
E
Efcore.Pg
项目概览
jobily
/
Efcore.Pg
10 个月 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
Efcore.Pg
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
153db6e5
编写于
9月 13, 2022
作者:
S
Shay Rojansky
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Simplify update pipeline implementation
And adapt to the new upstream (no more RequiresResultPropagation)
上级
147fb679
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
43 addition
and
61 deletion
+43
-61
src/EFCore.PG/Update/Internal/NpgsqlModificationCommandBatch.cs
...Core.PG/Update/Internal/NpgsqlModificationCommandBatch.cs
+42
-60
src/EFCore.PG/Update/Internal/NpgsqlUpdateSqlGenerator.cs
src/EFCore.PG/Update/Internal/NpgsqlUpdateSqlGenerator.cs
+1
-1
未找到文件。
src/EFCore.PG/Update/Internal/NpgsqlModificationCommandBatch.cs
浏览文件 @
153db6e5
...
...
@@ -49,49 +49,40 @@ protected override void Consume(RelationalDataReader reader)
try
{
while
(
true
)
bool
?
onResultSet
=
null
;
for
(;
commandIndex
<
ModificationCommands
.
Count
;
commandIndex
++)
{
// Find the next propagating command, if any
int
nextPropagating
;
for
(
nextPropagating
=
commandIndex
;
nextPropagating
<
ModificationCommands
.
Count
&&
!
ResultSetMappings
[
nextPropagating
].
HasFlag
(
ResultSetMapping
.
HasResultRow
);
nextPropagating
++)
// Note that in the PG provider, we never transmit rows affected via the result set - it's always transmitted separately via
// the PG wire protocol and exposed on the reader (see below).
// As a result, if there's a result set we know that it contains values to be propagated back into the entity instance.
if
(
ResultSetMappings
[
commandIndex
].
HasFlag
(
ResultSetMapping
.
HasResultRow
))
{
}
var
modificationCommand
=
ModificationCommands
[
commandIndex
];
// Go over all non-propagating commands before the next propagating one,
// make sure they executed
for
(;
commandIndex
<
nextPropagating
;
commandIndex
++)
{
#pragma warning disable 618
if
(
npgsqlReader
.
Statements
[
commandIndex
].
Rows
==
0
)
if
(!
reader
.
Read
())
{
ThrowAggregateUpdateConcurrencyException
(
reader
,
commandIndex
,
1
,
0
);
}
#pragma warning restore 618
}
if
(
nextPropagating
==
ModificationCommands
.
Count
)
{
Debug
.
Assert
(!
npgsqlReader
.
NextResult
(),
"Expected less resultsets"
);
break
;
}
// Propagate to results from the reader to the ModificationCommand
modificationCommand
.
PropagateResults
(
reader
);
var
modificationCommand
=
ModificationCommands
[
commandIndex
];
onResultSet
=
npgsqlReader
.
NextResult
();
}
if
(!
reader
.
Read
())
// TODO: when EF Core adds support for DbBatch (https://github.com/dotnet/efcore/issues/18990), we can start using that
// standardized API for fetching the rows affected by an individual command in a batch.
#pragma warning disable 618
if
(
npgsqlReader
.
Statements
[
commandIndex
].
Rows
==
0
)
{
ThrowAggregateUpdateConcurrencyException
(
reader
,
commandIndex
,
1
,
0
);
}
#pragma warning restore 618
}
modificationCommand
.
PropagateResults
(
reader
);
npgsqlReader
.
NextResult
();
commandIndex
++;
if
(
onResultSet
==
true
)
{
Dependencies
.
UpdateLogger
.
UnexpectedTrailingResultSetWhenSaving
();
}
}
catch
(
Exception
ex
)
when
(
ex
is
not
DbUpdateException
and
not
OperationCanceledException
)
...
...
@@ -121,51 +112,42 @@ protected override async Task ConsumeAsync(RelationalDataReader reader, Cancella
try
{
while
(
true
)
bool
?
onResultSet
=
null
;
for
(;
commandIndex
<
ModificationCommands
.
Count
;
commandIndex
++)
{
// Find the next propagating command, if any
int
nextPropagating
;
for
(
nextPropagating
=
commandIndex
;
nextPropagating
<
ModificationCommands
.
Count
&&
!
ResultSetMappings
[
nextPropagating
].
HasFlag
(
ResultSetMapping
.
HasResultRow
);
nextPropagating
++)
// Note that in the PG provider, we never transmit rows affected via the result set - it's transmitted via the PG wire
// protocol and exposed on the reader (see above).
// As a result, if there's a result set we know that it contains values to be propagated back into the entity instance.
if
(
ResultSetMappings
[
commandIndex
].
HasFlag
(
ResultSetMapping
.
HasResultRow
))
{
}
var
modificationCommand
=
ModificationCommands
[
commandIndex
];
// Go over all non-propagating commands before the next propagating one,
// make sure they executed
for
(;
commandIndex
<
nextPropagating
;
commandIndex
++)
{
#pragma warning disable 618
if
(
npgsqlReader
.
Statements
[
commandIndex
].
Rows
==
0
)
if
(!(
await
reader
.
ReadAsync
(
cancellationToken
).
ConfigureAwait
(
false
)))
{
await
ThrowAggregateUpdateConcurrencyExceptionAsync
(
reader
,
commandIndex
,
1
,
0
,
cancellationToken
)
.
ConfigureAwait
(
false
);
}
#pragma warning restore 618
}
if
(
nextPropagating
==
ModificationCommands
.
Count
)
{
Debug
.
Assert
(!(
await
npgsqlReader
.
NextResultAsync
(
cancellationToken
).
ConfigureAwait
(
false
)),
"Expected less resultsets"
);
break
;
}
// Extract result from the command and propagate it
modificationCommand
.
PropagateResults
(
reader
);
var
modificationCommand
=
ModificationCommands
[
commandIndex
];
onResultSet
=
await
npgsqlReader
.
NextResultAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
}
if
(!(
await
reader
.
ReadAsync
(
cancellationToken
).
ConfigureAwait
(
false
)))
// TODO: when EF Core adds support for DbBatch (https://github.com/dotnet/efcore/issues/18990), we can start using that
// standardized API for fetching the rows affected by an individual command in a batch.
#pragma warning disable 618
if
(
npgsqlReader
.
Statements
[
commandIndex
].
Rows
==
0
)
{
await
ThrowAggregateUpdateConcurrencyExceptionAsync
(
reader
,
commandIndex
,
1
,
0
,
cancellationToken
)
.
ConfigureAwait
(
false
);
}
#pragma warning restore 618
}
modificationCommand
.
PropagateResults
(
reader
);
await
npgsqlReader
.
NextResultAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
commandIndex
++;
if
(
onResultSet
==
true
)
{
Dependencies
.
UpdateLogger
.
UnexpectedTrailingResultSetWhenSaving
();
}
}
catch
(
Exception
ex
)
when
(
ex
is
not
DbUpdateException
and
not
OperationCanceledException
)
...
...
src/EFCore.PG/Update/Internal/NpgsqlUpdateSqlGenerator.cs
浏览文件 @
153db6e5
...
...
@@ -114,7 +114,7 @@ public NpgsqlUpdateSqlGenerator(UpdateSqlGeneratorDependencies dependencies)
AppendUpdateCommand
(
commandStringBuilder
,
name
,
schema
,
writeOperations
,
readOperations
,
conditionOperations
);
return
ResultSetMapping
.
LastInResultSet
;
return
readOperations
.
Count
>
0
?
ResultSetMapping
.
LastInResultSet
:
ResultSetMapping
.
NoResults
;
}
/// <summary>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录