私は次のモデルを持っています: 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
この奇妙なスタック トレースをどうすればいいのか本当にわかりません。わかりやすい行が見つかりません。
その理由は何ですか?