1

HTTPPOSTのdb.SaveChanges()で失敗している請求書の作成ビューがあります。例外メッセージは{"無効な列名'UserDetail_UserId'。"}です。POSTコントローラーでは、InvoiceItemsテーブルに追加しようとしているinvoiceitemオブジェクトに、UserDetailsテーブルのユーザー名が入力されるドロップダウンリストから選択したユーザー名が正しく入力されているように見えます。「UserId」はUserDetailsテーブルのキー列ですが、ドロップダウンリストでは使用されていないため、「UserDetail_UserId」列にデータを保存しようとしている理由がわかりません。以下の私のコード:

モデル:

public class InvoiceItem
{
    //Identity Column
    public int ServiceID { get; set; }

    [Key]
    public string ProfileUserName { get; set; }

    public DateTime InvoiceDate { get; set; }
    public string Address { get; set; }
    public string Note { get; set; }
    public decimal Price { get; set; }
    public decimal SubTotal { get; set; }
    public bool InvoicePaid { get; set; }
}

public class UserDetail
{
    [Key]
    public Guid UserId { get; set; }
    public string ProfileUserName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
    public string Phone { get; set; }
    public DateTime DateUpdated { get; set; }
    public virtual ICollection<InvoiceItem> InvoiceItems { get; set; }
}

public class ProShotDB : DbContext
{
    public DbSet<UserDetail> UserDetails { get; set; }
    public DbSet<UserLinkToken> UserLinkTokens { get; set; }
    public DbSet<InvoiceItem> InvoiceItems { get; set; }
}

コントローラー:

public ActionResult Create()
    {
        ViewBag.ProfileUserNames = db.UserDetails.Select(
        c => new
        {
            ProfileUserName = c.ProfileUserName,
            NameAddress = c.FullName + " - " + c.Address
        });
        return View();
    }

    [HttpPost]
    public ActionResult Create(InvoiceItem invoiceitem)
    {
        decimal Tax = 1.066m;
        if (ModelState.IsValid)
        {
            invoiceitem.InvoiceDate = DateTime.Now;
            invoiceitem.SubTotal = invoiceitem.Price*Tax;
            invoiceitem.InvoicePaid = false;

            db.InvoiceItems.Add(invoiceitem);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.ProfileUserNames = db.UserDetails.Select(
        c => new
        {
            ProfileUserName = c.ProfileUserName,
            NameAddress = c.FullName + " - " + c.Address
        });
        return View(invoiceitem);
    }

意見:

@model Pro_Shot_Portal.Models.InvoiceItem

@{
    ViewBag.Title = "Input Invoice";
}

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>Input Invoice:</legend>

    <div class="alert alert-error" style="width:250px;">
        <button type="button" class="close" data-dismiss="alert">×</button>
        <strong>Warning!</strong> Assigning invoice to wrong user could cause major problems, please triple check before proceeding.
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.ProfileUserName, "Attach invoice to user")
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model => model.ProfileUserName, new SelectList(ViewBag.ProfileUserNames, "ProfileUserName", "NameAddress"), "-- Pick Client For Invoice --")
        @Html.ValidationMessageFor(model => model.ProfileUserName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Address)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Address)
        @Html.ValidationMessageFor(model => model.Address)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Note)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Note)
        @Html.ValidationMessageFor(model => model.Note)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Price)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Price)
        @Html.ValidationMessageFor(model => model.Price)
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

<div>
    @Html.ActionLink("Cancel Invoice Creation", "Index")
</div>

invoiceitemモデルオブジェクトのプロパティは適切なデータで満たされていることがわかります。db.SaveChanges()で呼び出すデータベースの変更は「db.InvoiceItems.Add(invoiceitem);」のみです。「UserDetails_UserId」という名前の列にアクセス、書き込み、または更新しようとしている場所と理由を誰かに教えてもらえますか。たぶん、DropdownListForで何かを台無しにしたのは、それがUserDetailsテーブルと対話する唯一の部分だからですか?

ありがとう。

4

1 に答える 1

3

1対多の関係を設定しています。例外でアンダースコアが表示されている列名は、デフォルトで生成される関係です。詳細については、こちらをご覧ください。

于 2012-10-28T05:44:44.307 に答える