0

私は次のモデルを持っています: Item contains Product, Shipping, UserId (この製品を作成した)。「商品:商品」と「商品:配送」は「1:1」の関係です)。新しい製品をデータベースに追加しようとすると、SqlException が発生します。

値 NULL を列 'ProductId'、テーブル 'C:\USERS\ALEKSEY\REPOS\WORKING-COPY\WEBSTORE\WEBSTORE\APP_DATA\WEBSTORE.MDF.dbo.Products' に挿入できません。列はヌルを許可しません。INSERT は失敗します。

「ProductId」列の「Is Identity」プロパティを true から false に変更する前はすべて機能していたため、自動生成されなくなりました。xml ファイルからデータをアップロードする必要があるためです (そして、そのファイルの ID を ProductId に保持します)。また、新製品を追加するユーザーの能力も必要です。

以下は、新しい製品、配送、および対応するアイテムを作成するコントローラー アクション メソッドです。

public ViewResult Create()
    {
        var productId = 0;
        for (var i = 0; i < Int32.MaxValue; i++)
        {
            if (_productRepository.GetProduct(i) == null)
                productId = i;
        }    
        // the same code as above to get shippingId

        var p = _productRepository.CreateProduct(productId, "", "", 0, "", "", "");
        var s = _shippingRepository.CreateShipping(shippingId, 0, "");
        var userId = (Guid)Membership.GetUser().ProviderUserKey;
        var model = new StoreEditViewModel(_productRepository)
        {
            CurrentItem = _itemsRepository.CreateItem(p.ProductId, s.ShippingId, userId, DateTime.Now),
        };
        return View("Edit", model);
    }

商品作成の行にコメントすると、配送時に同じ例外が発生します。

以下は、Linq To SQL を使用して新しい製品を作成する ProductRepository メソッドです。

public Product CreateProduct(int productId, string name, /* other properties */)
    {
        var product = new Product
        {
            ProductId = productId,
            Name = name,
            // other properties
        };
        _dataContext.Products.InsertOnSubmit(product);
        _dataContext.SubmitChanges(); // SqlException occures !
        return product;
    }   

どうすればこれを修正できますか?

編集 1: CreateProduct(100, other stuff) メソッドで productId の代わりに整数を挿入しようとしました。それでもSqlExceptionを取得します:

値 NULL を列 'ProductId'、テーブル 'WebStore.dbo.Products' に挿入できません。列はヌルを許可しません。INSERT は失敗します。ステートメントは終了されました。

編集 2: _dataContext は、変更された列のプロパティを認識していないように見えました (@devio がサポートしているため)。MyAppDataContext クラスを更新する必要がありました。

質問は実際に回答されていますが、別の問題があります。Create() メソッドを呼び出すと、Product、Shipping および Item エントリが対応するテーブルに追加されます。Create() メソッドよりも、実際のデータを入力できる「編集」ビューが返されます (新しいアイテムが作成された時点では空です)。

「編集」ビューのフォームよりも、Edit() アクション メソッドによって処理する必要があります。

    [HttpPost]
    public ActionResult Edit(StoreEditViewModel model, HttpPostedFileBase image)
    {
        var p = model.CurrentItem.Product;
        var s = model.CurrentItem.Shipping;
        if (ModelState.IsValid)
        {
            if (image != null)
            {
                var path = AppDomain.CurrentDomain.BaseDirectory +
                          ConfigurationManager.AppSettings["product-images-directory"];
                var imageName = "prod-" + p.ProductId.ToString(CultureInfo.InvariantCulture) + ".jpg";
                image.SaveAs(path + imageName);
            }
            _productRepository.UpdateProduct(p);
            _shippingRepository.UpdateShipping(s);
            return RedirectToAction("Content");
        }
        return View("Edit", model);
    }

そして、私は(私自身の翻訳)「アプリケーションのサーバーエラー」、スタックトレースを取得します:

[MissingMethodException: No parameterless constructor defined for this object.]


System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +113
System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232
System.Activator.CreateInstance(Type type, Boolean nonPublic) +83
System.Activator.CreateInstance(Type type) +6
System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +183
System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +564
System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +411
System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +317
System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +117
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +324
System.Web.Mvc.Controller.ExecuteCore() +106
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +91
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +34
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +19
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +10
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +48
System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9629708
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

この奇妙なスタック トレースをどうすればいいのか本当にわかりません。わかりやすい行が見つかりません。

その理由は何ですか?

4

1 に答える 1

0

編集 2 で既に書いたように、_dataContext は変更された列のプロパティを認識していないようでした (@devio がサポートしているため)。MyAppDataContext クラスを更新する必要がありました。

StoreEditViewModel にパラメーターなしのコンストラクターがないために MissingMethodException が発生したため、空のコンストラクターを追加すると、すべてが機能し始めました。

StoreEditViewModel には、DefaultModelBinder がインスタンス化するためのパラメーターなしのコンストラクターが必要でした。

于 2013-02-07T11:54:19.643 に答える