2012-10-28 79 views
1

我有一個在HTTPPOST上的db.SaveChanges()失敗的發票的創建視圖。異常消息是{「無效的列名'UserDetail_UserId'。」}。在POST控制器中,它看起來像我試圖添加到我的InvoiceItems表中的invoiceitem對象使用從UserDetails表中的用戶名填充的下拉列表中選擇的用戶名正確填充。 「UserId」是UserDetails表中的關鍵列,但它並未在下拉列表中使用,所以我不清楚爲什麼有任何數據試圖保存到「UserDetail_UserId」列。我下面的代碼:MVC3:HTTPPOST控制器db.SaveChanges()失敗,出現「無效的列名稱」

型號:

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表交互的唯一部分?

謝謝。

+2

聽起來好像EF可能正在尋找某個用戶表上的外鍵列,當你可能只有使用同一個鍵的1:1關係的用戶和UserDetail。 (換句話說,我認爲你錯過了相關的代碼。) –

+0

UserDetails上的UserId(PK)與默認成員資格提供程序aspnet_Users表上的UserId(PK)相同。我通過添加FK到將UserDetails連接到aspnet_Users.UserId的代碼工作。然後將一個UserId字段添加到InvoiceItems表中,並將一個FK添加到UserDetails.UserId,然後將我的選擇列表值更改爲UserIds。然而,我試圖避免將任何FK附加到默認會員表,因爲我被告知它可能會導致問題,並且是不好的做法。猜猜我可能不得不重新考慮我的整個設計。謝謝。 –

回答

3

您有一對多的關係設置,您在異常中看到的具有下劃線的列名稱是默認生成的關係。有關更多詳細信息,請參閱here

+0

我仍然不完全清楚,爲什麼我需要將UserDetails.UserId上的FK指向aspnet_Users.UserId,但是它指定的FK是問題所在。它似乎沒有讓我在我的任何模型屬性上使用[ForeignKey()]屬性,所以我使用SSMS設置密鑰,我認爲它實際上是同樣的事情。在你的鏈接中有一些很好的閱讀,我必須繼續學習,謝謝你的幫助。 –

+0

當您在模型中添加「此公開虛擬ICollection 」時,您告訴模型構建器存在關係。按照慣例,這意味着它期望UserDetail_UserId。你可以在模型生成器中使用流暢的api來覆蓋這種行爲(請點擊這裏)http://msdn.microsoft.com/en-us/data/hh134698.aspx – slipsec

+0

現在,好了很多。我在其他示例中看到了公共虛擬ICollection 屬性,但顯然未完全理解MVC3如何使用它。再次感謝。 –

相關問題