c# - EntityFramework Core 环境之间的不同查询
问题描述
我正在使用 EntityFrameworkCore.SqlServer v 5.0.2 运行一个非常简单的数据库实体更新,但我得到了一个奇怪的行为......在我的本地环境中,更新查询工作得很好,但是当我将环境切换到生产时我得到一个例外。
我进一步调试并意识到在生产中 EntityFramework 正在尝试使用相同的主键 ID 在不同的表中插入一条记录,这会导致异常。
这是我的代码片段:
var package = await _context.Packages.FindAsync(request.Id);
if (package == null) throw new RestException(HttpStatusCode.NotFound, new { package = "Could not find Package" });
package.Name = request.Name ?? package.Name;
package.ValidUntil = request.ValidUntil ?? package.ValidUntil;
package.Variants = request.Variants ?? package.Variants;
package.Active = request.Active ?? package.Active;
var success = await _context.SaveChangesAsync() > 0;
一些注意事项: Variants 是一个包含名为 CurrencyId 的枚举的实体。我有一个数据库表,将这些枚举的值保存为 Db 中的记录
public class Variant
{
public Guid Id { get; set; }
public string Name { get; set; }
public SubscriptionTypeEnum SubscriptionTypeId { get; set; }
public virtual SubscriptionType SubscriptionType { get; set; }
[Column(TypeName = "decimal(18,2)")]
public decimal VariantPrice { get; set; }
public CurrencyEnum CurrencyId { get; set; }
public virtual Currency Currency { get; set; }
}
并且抛出的异常(仅在生产中)如下
Microsoft.Data.SqlClient.SqlException (0x80131904): Violation of PRIMARY KEY constraint 'PK_Currencies'. Cannot insert duplicate key in object 'dbo.Currencies'. The duplicate key value is (0).
The statement has been terminated.
at Microsoft.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__169_0(Task`1 result)
at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
at System.Threading.Tasks.Task.<>c.<.cctor>b__277_0(Object obj)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location ---
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)
ClientConnectionId:a1e3bf81-e486-4e22-9ce6-e0b6601d4bd1
Error Number:2627,State:1,Class:14
再次重申,这仅在生产中发生,但在本地更新工作正常。
在线索可能是什么问题以及如何解决它?
解决方案
推荐阅读
- unity3d - 如何使用 Odin Serializer 保存 Unity GameObject?
- css - CSS3双背景图像未在Firefox中显示,但在Chrome中显示?
- r - 计算R中标记之间的单词
- android - 如何在 Android JNI 上设置 SQLite 以处理 C 中的多线程持久性
- node.js - Discord 节点 js “TypeError:channel.send 不是函数”
- python - 如何从 JPATH 构造 JSON
- javascript - onchange of SELECT 元素我希望下一个 INPUT 元素需要更改。INPUT 元素在数组“quest[]”中命名
- docker - heroku-container-registry 被列入黑名单
- ios - 将块并发插入并发队列
- reactjs - React 中的双重渲染 - 这是一个问题吗?