1

我正在研究 http://www.ideliverable.com/blog/writing-an-orchard-webshop-module-from-scratch-part-9

我的果园版本是1.9

订单记录.cs

public class OrderRecord
    {
        public virtual int Id { get; set; }
        public virtual int CustomerId { get; set; }
        public virtual DateTime CreatedAt { get; set; }
        public virtual decimal SubTotal { get; set; }
        public virtual decimal Vat { get; set; }
        public virtual OrderStatus Status { get; set; }
        public virtual IList<OrderDetailRecord> Details { get; private set; }
        public virtual string PaymentServiceProviderResponse { get; set; }
        public virtual string PaymentReference { get; set; }
        public virtual DateTime? PaidAt { get; set; }
        public virtual DateTime? CompletedAt { get; set; }
        public virtual DateTime? CancelledAt { get; set; }

        public virtual decimal Total
        {
            get { return SubTotal + Vat; }
            private set { }
        }

        public virtual string Number
        {
            get { return (Id + 1000).ToString(CultureInfo.InvariantCulture); }
            private set { }
        }

        public OrderRecord()
        {
            Details = new List<OrderDetailRecord>();
        }

        public virtual void UpdateTotals()
        {
            var subTotal = 0m;
            var vat = 0m;

            foreach (var detail in Details)
            {
                subTotal += detail.SubTotal;
                vat += detail.Vat;
            }

            SubTotal = subTotal;
            Vat = vat;
        } 

没有额外的内容部分类,因为我需要使用 id 并且方法在同一个类中定义。不需要创建表的字段设置器被定义为私有。TotalNumber

迁移.cs

 SchemaBuilder.CreateTable("OrderRecord", t => t
                    .Column<int>("Id", c => c.PrimaryKey().Identity())
                    .Column<int>("CustomerId", c => c.NotNull())
                    .Column<DateTime>("CreatedAt", c => c.NotNull())
                    .Column<decimal>("SubTotal", c => c.NotNull())
                    .Column<decimal>("Vat", c => c.NotNull())
                    .Column<string>("Status", c => c.WithLength(50).NotNull())
                    .Column<string>("PaymentServiceProviderResponse", c => c.WithLength(null))
                    .Column<string>("PaymentReference", c => c.WithLength(50))
                    .Column<DateTime>("PaidAt", c => c.Nullable())
                    .Column<DateTime>("CompletedAt", c => c.Nullable())
                    .Column<DateTime>("CancelledAt", c => c.Nullable())

                    );

使用这些字段正确创建的表但是当我想使用 IRepository.Create (T Entity) 方法在 OrderService.cs 中创建 OrderRecord 时,它会发送未绑定到表的字段。TotalNumber

订单服务.cs

public OrderRecord CreateOrder(int customerId, IEnumerable<ShoppingCartItem> items)
{

    if (items == null)
        throw new ArgumentNullException("items");

    // Convert to an array to avoid re-running the enumerable
    var itemsArray = items.ToArray();

    if (!itemsArray.Any())
        throw new ArgumentException("Creating an order with 0 items is not supported", "items");

    var order = new OrderRecord
    {
        CreatedAt = _dateTimeService.Now,
        CustomerId = customerId,
        Status = OrderStatus.New
    };

    _orderRepository.Create(order);

最后一行抛出错误是错误日志:

2018-04-20 18:37:15,871 [16] Orchard.Exceptions.DefaultExceptionPolicy - 默认 - 捕获到意外异常 [ http://localhost:64607/Orchard.WebShop/Order/Create] NHibernate.Exceptions.GenericADOException: 可以不插入:[Orchard.Webshop.Models.OrderRecord][SQL: INSERT INTO Orchard_Webshop_OrderRecord (CustomerId, CreatedAt, SubTotal, Vat, Status, PaymentServiceProviderResponse, PaymentReference, PaidAt, CompletedAt, CancelledAt, Total, Number) 值 (?, ?, ? , ?, ?, ?, ?, ?, ?, ?, ?, ?); 选择 SCOPE_IDENTITY()] ---> System.Data.SqlClient.SqlException:列名“总计”无效。列名“数字”无效。无法准备报表。
在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection,操作1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject state&Obj, Boolean dataReady) 在 System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() 在 System.Data.SqlClient.SqlDataReader.get_MetaData() 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption) 在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream,布尔异步、Int32 超时、任务和任务、布尔异步写入、布尔 inRetry、SqlDataReader ds、布尔 describeParameterEncryptionRequest)在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior runBehavior、布尔 returnStream、字符串方法、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.System.Data.IDbCommand.ExecuteReader()
at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)
at NHibernate.Id.IdentityGenerator.InsertSelectDelegate.ExecuteAndExtract(IDbCommand insert, ISessionImplementor session) at NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL, ISessionImplementor session, IBinder binder) --- End of inner exception stack trace --- at NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL, ISessionImplementor session, IBinder binder) at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object[] fields, Boolean[] notNull, SqlCommandInfo sql, Object obj, ISessionImplementor session) at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object[] fields, Object obj, ISessionImplementor session) at NHibernate.Action.EntityIdentityInsertAction.Execute() at NHibernate.Engine.ActionQueue.Execute(IExecutable executable) at NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) at NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event) at NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event) at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event) at NHibernate.Impl.SessionImpl.Save(Object obj) at Orchard.Data.Repository
1.在 C:\Users\Selman\Orchard-dev\src\Orchard\Data\Repository.cs 中创建(T 实体):
Orchard.Data.Repository 的第 93 行1 项)在 C:\Users\Selman\Orchard- dev\src\Orchard.Web\Modules\Orchard.Webshop\Services\OrderService.cs:C:\Users\Selman\Orchard-dev\src\Orchard 中 Orchard.Webshop.Controllers.OrderController.Create() 的第 46 行。 Web\Modules\Orchard.Webshop\Controllers\OrderController.cs:第 48 行,位于 System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase 控制器,Object[] 参数) 的 lambda_method(Closure , ControllerBase , Object[] ) 在 System.Web .Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary1.Orchard.Data.IRepository<T>.Create(T entity) in C:\Users\Selman\Orchard-dev\src\Orchard\Data\Repository.cs:line 33
at Orchard.Webshop.Services.OrderService.CreateOrder(Int32 customerId, IEnumerable
2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 个参数)在 System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 的 System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 的 System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) 2.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase1.End() 在 System.Web.Mvc.Async.AsyncControllerActionInvoker。 EndInvokeActionMethod(IAsyncResult asyncResult) 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3d() 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.b__3f() 在 System.Web.Mvc.Async。 AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.b__3f() 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.b__3f()

解决方案

我暂时找到了解决方案。我把TotalNumber领域变成了方法public virtual decimal Total()public virtual string Number()。它现在可以工作。

4

0 回答 0