首页 > 解决方案 > 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

再次重申,这仅在​​生产中发生,但在本地更新工作正常。

在线索可能是什么问题以及如何解决它?

标签: c#entity-frameworkentity-framework-core

解决方案


推荐阅读