我有一個在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表交互的唯一部分?
謝謝。
聽起來好像EF可能正在尋找某個用戶表上的外鍵列,當你可能只有使用同一個鍵的1:1關係的用戶和UserDetail。 (換句話說,我認爲你錯過了相關的代碼。) –
UserDetails上的UserId(PK)與默認成員資格提供程序aspnet_Users表上的UserId(PK)相同。我通過添加FK到將UserDetails連接到aspnet_Users.UserId的代碼工作。然後將一個UserId字段添加到InvoiceItems表中,並將一個FK添加到UserDetails.UserId,然後將我的選擇列表值更改爲UserIds。然而,我試圖避免將任何FK附加到默認會員表,因爲我被告知它可能會導致問題,並且是不好的做法。猜猜我可能不得不重新考慮我的整個設計。謝謝。 –