【问题标题】:Getting ID of product from nopcommerce IConsumer<EntityFinalised<Product> Event从 nopcommerce IConsumer<EntityFinalised<Product> 事件获取产品 ID
【发布时间】:2018-04-18 02:02:33
【问题描述】:

好的,我收到一条关于无效 ID 列的错误消息:

System.Data.Entity.Infrastructure.DbUpdateException:发生错误 在更新条目时。有关详细信息,请参阅内部异常。 ---> System.Data.Entity.Core.UpdateException:发生错误时 更新条目。有关详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException:列名“Id”无效。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常, Boolean breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler、SqlDataReader 数据流、 BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) 在 System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() 在 System.Data.SqlClient.SqlDataReader.get_MetaData() 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior,字符串 resetOptionsString,布尔值 isInternal, Boolean forDescribeParameterEncryption) 在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior、RunBehavior runBehavior、布尔 returnStream、布尔 异步,Int32 超时,任务和任务,布尔 asyncWrite,布尔 inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest) 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior、runBehavior、布尔返回流、字符串 方法,TaskCompletionSource1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<Reader>b__c(DbCommand t, DbCommandInterceptionContext1 c) 在 System.Data.Entity.Infrastructure.Interception.InternalDispatcher1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func3 操作,TInterceptionContext 拦截上下文, Action3 executing, Action3 执行)在 System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand 命令,DbCommandInterceptionContext 拦截上下文)在 System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior 行为)在 System.Data.Common.DbCommand.ExecuteReader(CommandBehavior 行为) 在 System.Data.Entity.Core.Mapping.Update.Internal.DynamicUpdateCommand.Execute(Dictionary2 identifierValues, List1 generatedValues) 在 System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update() --- 内部异常堆栈跟踪结束 --- 在 System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update() 在 System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.b__2(UpdateTranslator ut) 在 System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update[T](T noChangesResult, Func2 updateFunction) at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update() at System.Data.Entity.Core.Objects.ObjectContext.<SaveChangesToStore>b__35() at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess) 在 System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions 选项,IDbExecutionStrategy executionStrategy,布尔值 startLocalTransaction) 在 System.Data.Entity.Core.Objects.ObjectContext.c__DisplayClass2a.b__27() 在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func1 operation) at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options, Boolean executeInExistingTransaction) at System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions options) at System.Data.Entity.Internal.InternalContext.SaveChanges() --- End of inner exception stack trace --- at System.Data.Entity.Internal.InternalContext.SaveChanges() at System.Data.Entity.Internal.LazyInternalContext.SaveChanges() at System.Data.Entity.DbContext.SaveChanges() at Nop.Data.EfRepository1.Insert(T entity) in C:\projects\snowys-website\Libraries\Nop.Data\EfRepository.cs:81 行 在 Nop.Plugin.Widgets.Enhancements.Services.AmazonProductService.InsertAmazonProduct(AmazonProduct 亚马逊产品)在 Nop.Plugin.Widgets.Enhancements.Events.ProductSaveConsumer.HandleEvent(EntityFinalised1 eventMessage) at Nop.Services.Events.EventPublisher.PublishToConsumer[T](IConsumer1 x, T 事件消息)在 C:\projects\snowys-website\Libraries\Nop.Services\Events\EventPublisher.cs:line 40

这是我的产品保存事件类

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Nop.Core;
using Nop.Core.Domain.Catalog;
using Nop.Core.Events;
using Nop.Core.Infrastructure;
using Nop.Plugin.Widgets.Enhancements.Domain;
using Nop.Plugin.Widgets.Enhancements.Services;
using Nop.Services.Events;
using Nop.Web.Framework.Events;

namespace Nop.Plugin.Widgets.Enhancements.Events
{
/// <summary>
/// This class is used to detect when a Product has been edited so we can update the relevant Amazon fields.
/// </summary>
public class ProductSaveConsumer : IConsumer<EntityFinalised<Product>>
{
    public void HandleEvent(EntityFinalised<Product> eventMessage)
    {
        // This event is triggered multiple times when a product is updated.
        // We only want to update the amazon fields once, as to avoid
        // performance issues.
        var httpContext = HttpContext.Current;
        if (httpContext != null && httpContext.Request.Form.HasKeys() &&
            httpContext.Request.Form.Get("AmazonProductSKU") != null)
        {
            #region Fields

            // Register services we will need to update the database fields
            var _amazonProductService = EngineContext.Current.Resolve<IAmazonProductService>();

            // Other variables
            var form = httpContext.Request.Form;
            var isNewAmazonProduct = true;

            #endregion

            System.Diagnostics.Debug.WriteLine("form has been submitted");

            // Get the AmazonProduct row from our custom table for the product (if it already exists)
            // isNewAmazonProduct = false;
            var amazonProductExists = false;//_amazonProductService.GetAmazonProductById(eventMessage.Entity.Id).Exists(x => x.ProductId == eventMessage.Entity.Id);

            if (amazonProductExists) {
                isNewAmazonProduct = false;
                System.Diagnostics.Debug.WriteLine("not new amazon product");
            }
            else
            {
                isNewAmazonProduct = true;
                System.Diagnostics.Debug.WriteLine("is new amazon product");
            }

            var amazonProduct = new AmazonProduct();

            //set the product id
            amazonProduct.ProductID = Int32.Parse(eventMessage.Entity.Id.ToString());

            // Now let's update the fields
            // AmazonProductSKU
            if (!String.IsNullOrEmpty(form["AmazonProductSKU"]))
            {
                amazonProduct.AmazonProductSKU = form["AmazonProductSKU"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product sku");
            }

            // AmazonID
            if (!String.IsNullOrEmpty(form["AmazonID"]))
            {
                amazonProduct.AmazonID = form["AmazonID"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon id");
            }

            // AmazonProductIDType
            if (!String.IsNullOrEmpty(form["AmazonProductIDType"]))
            {
                amazonProduct.AmazonID = form["AmazonProductIDType"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product id type");
            }

            // AmazonProductTitle
            if (!String.IsNullOrEmpty(form["AmazonProductTitle"]))
            {
                amazonProduct.AmazonProductTitle = form["AmazonProductTitle"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product title");
            }

            // AmazonProductDescription
            if (!String.IsNullOrEmpty(form["AmazonProductDescription"]))
            {
                amazonProduct.AmazonProductDescription = form["AmazonProductDescription"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product description");
            }

            // AmazonProductManufacturer
            if (!String.IsNullOrEmpty(form["AmazonProductManufacturer"]))
            {
                amazonProduct.AmazonProductManufacturer = form["AmazonProductManufacturer"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product manufacturer");
            }

            // AmazonProductType
            if (!String.IsNullOrEmpty(form["AmazonProductType"]))
            {
                amazonProduct.AmazonProductType = form["AmazonProductType"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product type");
            }

            // AmazonProductBrandName
            if (!String.IsNullOrEmpty(form["AmazonProductBrandName"]))
            {
                amazonProduct.AmazonProductBrandName = form["AmazonProductBrandName"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product brand name");
            }

            // AmazonProductShippingTemplate
            if (!String.IsNullOrEmpty(form["AmazonProductShippingTemplate"]))
            {
                amazonProduct.AmazonProductShippingTemplate = form["AmazonProductShippingTemplate"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product shipping template");
            }

            // AmazonProductSeoRecommendedBrowserNodes1
            if (!String.IsNullOrEmpty(form["AmazonProductSeoRecommendedBrowserNodes1"]))
            {
                amazonProduct.AmazonProductSeoRecommendedBrowserNodes1 = form["AmazonProductSeoRecommendedBrowserNodes1"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product seo node 1");
            }

            // AmazonProductSeoRecommendedBrowserNodes2
            if (!String.IsNullOrEmpty(form["AmazonProductSeoRecommendedBrowserNodes2"]))
            {
                amazonProduct.AmazonProductSeoRecommendedBrowserNodes2 = form["AmazonProductSeoRecommendedBrowserNodes2"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product seo node 2");
            }

            // AmazonProductMainImgUrl
            if (!String.IsNullOrEmpty(form["AmazonProductMainImgUrl"]))
            {
                amazonProduct.AmazonProductMainImgUrl = form["AmazonProductMainImgUrl"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product main image url");
            }

            // AmazonProductCountryOfPublication
            if (!String.IsNullOrEmpty(form["AmazonProductCountryOfPublication"]))
            {
                amazonProduct.AmazonProductCountryOfPublication = form["AmazonProductCountryOfPublication"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product country of pub");
            }

            // AmazonProductMfgWarrantySwitchedOffAu
            if (!String.IsNullOrEmpty(form["AmazonProductMfgWarrantySwitchedOffAu"]))
            {
                amazonProduct.AmazonProductMfgWarrantySwitchedOffAu = form["AmazonProductMfgWarrantySwitchedOffAu"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product mfg warranty");
            }

            // AmazonKeyProductFeatures1
            if (!String.IsNullOrEmpty(form["AmazonKeyProductFeatures1"]))
            {
                amazonProduct.AmazonKeyProductFeatures1 = form["AmazonKeyProductFeatures1"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product feature 1");
            }

            // AmazonKeyProductFeatures2
            if (!String.IsNullOrEmpty(form["AmazonKeyProductFeatures2"]))
            {
                amazonProduct.AmazonKeyProductFeatures2 = form["AmazonKeyProductFeatures2"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product feature 2");
            }

            // AmazonKeyProductFeatures3
            if (!String.IsNullOrEmpty(form["AmazonKeyProductFeatures3"]))
            {
                amazonProduct.AmazonKeyProductFeatures3 = form["AmazonKeyProductFeatures3"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product feature 3");
            }

            // AmazonKeyProductFeatures4
            if (!String.IsNullOrEmpty(form["AmazonKeyProductFeatures4"]))
            {
                amazonProduct.AmazonKeyProductFeatures4 = form["AmazonKeyProductFeatures4"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product feature 4");
            }

            // AmazonKeyProductFeatures5
            if (!String.IsNullOrEmpty(form["AmazonKeyProductFeatures5"]))
            {
                amazonProduct.AmazonKeyProductFeatures5 = form["AmazonKeyProductFeatures5"].ToString();
                System.Diagnostics.Debug.WriteLine("amazon product feature 5");
            }

            // AmazonProductPrice
            if (!String.IsNullOrEmpty(form["AmazonProductPrice"].ToString()))
            {
                amazonProduct.AmazonProductPrice = Decimal.Parse(form["AmazonProductPrice"]);
                System.Diagnostics.Debug.WriteLine("amazon product price");
            }

            // Call the update or insert function (depending on whether or not the AmazonProduct already existed)
            if (isNewAmazonProduct)
            {
                _amazonProductService.InsertAmazonProduct(amazonProduct);
                System.Diagnostics.Debug.WriteLine("amazon product inserted");
            }
            else {
                _amazonProductService.UpdateAmazonProduct(amazonProduct);
                System.Diagnostics.Debug.WriteLine("amazon product updated");
            }
        }
    }
}
}

任何人都知道为什么会导致错误,我没有访问产品 ID 对吗?

干杯

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建minimal reproducible example
  • 我已经添加了答案,问题不是我想的

标签: c# entity-framework nopcommerce


【解决方案1】:

好的,事实证明这是我的amazonproduct.cs 域和amazonproductmap.cs 的设置问题。不是我访问产品 ID 的方式。

在我的amazonproduct.cs 文件中,我继承了baseentity

using Nop.Core;
using System.ComponentModel.DataAnnotations.Schema;

namespace Nop.Plugin.Widgets.Enhancements.Domain
{
    public class AmazonProduct : BaseEntity //I was inheriting the baseentity
    {
        //code omitted
    }
}

所以因为我继承了基础实体,所以它使用了导致问题的字段 Id。

所以在我的amazonproductmap 中我不得不忽略这个专栏:

using System.Data.Entity.ModelConfiguration;
using Nop.Plugin.Widgets.Enhancements.Domain;

namespace Nop.Plugin.Widgets.Enhancements.Data
{
public class AmazonProductMap : EntityTypeConfiguration<AmazonProduct>
{
    public AmazonProductMap()
    {
        ToTable("amazonProductInfo");
        HasKey(p => p.AmazonProductID);

        Ignore(p => p.Id); //I had to ignore this column
        //other fields omitted
    }
}
}

我希望这对其他人有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多