C# MVC INSERT语句与外键约束“冲突”;FK_dbo.Ticket_dbo.User_UserID";

C# MVC INSERT语句与外键约束“冲突”;FK_dbo.Ticket_dbo.User_UserID";,c#,asp.net-mvc,entity-framework,relational-database,C#,Asp.net Mvc,Entity Framework,Relational Database,我正在创建一个票务系统,用户将进入票务页面,在出现问题时创建票务。 这是一个带有EF6 web应用程序的MVC4,由于缺乏MVC知识,我一直遇到无法解决的错误 我一直遵循一个人的指示: 在我以前版本的代码中,我有另一个用户下拉列表,但被告知是错误的 您正在创建一个新票证,并且该票证应分配给 当前用户。当前用户应无法创建票证 对于其他用户。你甚至不应该有这样的下拉列表 财产。您只能在帖子中指定Author(或UserID`)的值 方法,然后再保存数据模型 所以我拿出了我的用户下拉列表,你可以从下面

我正在创建一个票务系统,用户将进入票务页面,在出现问题时创建票务。 这是一个带有EF6 web应用程序的MVC4,由于缺乏MVC知识,我一直遇到无法解决的错误

我一直遵循一个人的指示:

在我以前版本的代码中,我有另一个用户下拉列表,但被告知是错误的

您正在创建一个新票证,并且该票证应分配给 当前用户。当前用户应无法创建票证 对于其他用户。你甚至不应该有这样的下拉列表 财产。您只能在帖子中指定Author(或UserID`)的值 方法,然后再保存数据模型

所以我拿出了我的用户下拉列表,你可以从下面的第二张图片中看到。在创建票据时,我还添加了
Author=model.UserID,

        Ticket ticket = new Ticket
        {
            Author = model.UserID,
            Issue = model.Issue,
            IssuedTo = model.IssuedTo,
            CategoryID = model.CategoryID
        };
您的第一个if(!ModelState.IsValid)是正确的,但您需要 更改ConfigureViewModel()方法以同时创建SelectList的 对于类别。然后创建票证数据模型,需要设置所有 它的性质包括CategoryID

因此,我在下面添加了代码,它应该是ConfigureViewModel方法中的SelectList或categories

    IEnumerable<Category> categories = db.Categories.OrderBy(u => u.CategoryName);
    model.CategoryList = categories.Select(a => new SelectListItem
    {
        Value = a.CategoryID.ToString(),
        Text = a.CategoryName.ToString()
    });
视图\Ticket\Create.cshtml

@model RecreationalServicesTicketingSystem.ViewModels.TicketVM

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Ticket</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.CategoryID, "Category")
        </div>
        <div class="editor-field">
            @Html.DropDownList("CategoryID", String.Empty)
            @Html.ValidationMessageFor(model => model.CategoryID)
        </div>

        <div class="editor-field">
            @using (Html.BeginForm())
            {
                @Html.HiddenFor(m => m.UserID)
                <div class="form-group">
                    @Html.LabelFor(m => m.IssuedTo)
                    @Html.DropDownListFor(m => m.IssuedTo, Model.AdministratorList, "Please select", new { @class = "form-control" })
                    @Html.ValidationMessageFor(m => m.IssuedTo)
                </div>
                <div class="form-group">
                    @Html.LabelFor(m => m.Issue)
                    @Html.TextBoxFor(m => m.Issue, new { @class = "form-control" })
                    @Html.ValidationMessageFor(m => m.Issue)
                </div>
            }
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
</fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
@model RecreationalServicesTicketingSystem.ViewModels.TicketVM

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Ticket</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.CategoryID, "Category")
        </div>


        <div class="editor-field">
            @using (Html.BeginForm())
            {
                @Html.HiddenFor(m => m.UserID)
                <div class="form-group">
                    @Html.DropDownListFor(m => m.CategoryID, Model.CategoryList, "Please select", new { @class = "form-control" })
                </div>
                <div class="form-group">
                    @Html.LabelFor(m => m.IssuedTo)
                    @Html.DropDownListFor(m => m.IssuedTo, Model.AdministratorList, "Please select", new { @class = "form-control" })
                    @Html.ValidationMessageFor(m => m.IssuedTo)
                </div>
                <div class="form-group">
                    @Html.LabelFor(m => m.Issue)
                    @Html.TextBoxFor(m => m.Issue, new { @class = "form-control" })
                    @Html.ValidationMessageFor(m => m.Issue)
                </div>
            }
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
</fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
@model RecreationalServicesTicketingSystem.ViewModels.TicketVM
@{
ViewBag.Title=“创建”;
}
创造
@使用(Html.BeginForm()){
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
票
@LabelFor(model=>model.CategoryID,“Category”)
@Html.DropDownList(“CategoryID”,String.Empty)
@Html.ValidationMessageFor(model=>model.CategoryID)
@使用(Html.BeginForm())
{
@Html.HiddenFor(m=>m.UserID)
@LabelFor(m=>m.IssuedTo)
@DropDownListFor(m=>m.IssuedTo,Model.AdministratorList,“请选择”,新建{@class=“form control”})
@Html.ValidationMessageFor(m=>m.IssuedTo)
@LabelFor(m=>m.Issue)
@TextBoxFor(m=>m.Issue,新的{@class=“form control”})
@Html.ValidationMessageFor(m=>m.Issue)
}

} @ActionLink(“返回列表”、“索引”) @节脚本{ @Scripts.Render(“~/bundles/jqueryval”) }
!!!!!!!!!!!!!!!更改代码

TicketController.cs

public class TicketController : Controller
{
    private IssueContext db = new IssueContext();

    //
    // GET: /Ticket/

    public ActionResult Index()
    {
        var tickets = db.Tickets.Include(t => t.Category).Include(t => t.User);    
        return View(tickets.ToList());
    }

    //
    // GET: /Ticket/Details/5

    public ActionResult Details(int id = 0)
    {
        Ticket ticket = db.Tickets.Find(id);
        if (ticket == null)
        {
            return HttpNotFound();
        }
        return View(ticket);
    }

    //
    // GET: /Ticket/Create

    public ActionResult Create()
    {
        TicketVM model = new TicketVM();
        ConfigureViewModel(model);
        return View(model);
    }

    //
    // POST: /Ticket/Create

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(TicketVM model)   
    {


        if (!ModelState.IsValid)
        {
            ConfigureViewModel(model);
            return View(model);
        }

        Ticket ticket = new Ticket
        {
            //UserID = (int)WebSecurity.CurrentUserId,
            // Author = model.UserID,
            Issue = model.Issue,
            IssuedTo = model.IssuedTo,
            CategoryID = model.CategoryID
        };

            db.Tickets.Add(ticket);
            db.SaveChanges();

        return RedirectToAction("Index");

    }

    private void ConfigureViewModel(TicketVM model)
    {
        IEnumerable<User> admins = db.Users.Where(u => u.IsAdministrator).OrderBy(u => u.LastName);
        model.AdministratorList = admins.Select(a => new SelectListItem
        {
            Value = a.UserID.ToString(),
            Text = string.Format("{0} {1}", a.FirstMidName, a.LastName)
        });
        IEnumerable<Category> categories = db.Categories.OrderBy(u => u.CategoryName);
        model.CategoryList = categories.Select(a => new SelectListItem
        {
            Value = a.CategoryID.ToString(),
            Text = a.CategoryName.ToString()
        });
    }

    //
    // GET: /Ticket/Edit/5

    public ActionResult Edit(int id = 0)
    {
        Ticket ticket = db.Tickets.Find(id);
        if (ticket == null)
        {
            return HttpNotFound();
        }
        ViewBag.AllAdmins = db.Users.Where(u => u.IsAdministrator).Include(u => u.Tickets);
        return View(ticket);
    }

    //
    // POST: /Ticket/Edit/5

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(Ticket ticket)
    {
        if (ModelState.IsValid)
        {
            db.Entry(ticket).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.AllAdmins = db.Users.Where(u => u.IsAdministrator).Include(u => u.Tickets);
        return View(ticket);
    }
公共类票证控制器:控制器
{
私有IssueContext db=新的IssueContext();
//
//拿到票/
公共行动结果索引()
{
var tickets=db.tickets.Include(t=>t.Category).Include(t=>t.User);
返回视图(tickets.ToList());
}
//
//获取:/Ticket/Details/5
公共操作结果详细信息(int id=0)
{
票证=db.Tickets.Find(id);
如果(票证==null)
{
返回HttpNotFound();
}
回程票;
}
//
//获取:/Ticket/创建
公共操作结果创建()
{
TicketVM模型=新的TicketVM();
配置视图模型(模型);
返回视图(模型);
}
//
//POST:/Ticket/创建
[HttpPost]
[ValidateAntiForgeryToken]
公共行动结果创建(TicketVM模型)
{
如果(!ModelState.IsValid)
{
配置视图模型(模型);
返回视图(模型);
}
票=新票
{
//UserID=(int)WebSecurity.CurrentUserId,
//Author=model.UserID,
问题=模型问题,
IssuedTo=model.IssuedTo,
CategoryID=model.CategoryID
};
db.Tickets.Add(ticket);
db.SaveChanges();
返回操作(“索引”);
}
私有void配置视图模型(TicketVM模型)
{
IEnumerable admins=db.Users.Where(u=>u.IsAdministrator).OrderBy(u=>u.LastName);
model.AdministratorList=admins.Select(a=>new SelectListItem
{
Value=a.UserID.ToString(),
Text=string.Format(“{0}{1}”,a.FirstMidName,a.LastName)
});
IEnumerable categories=db.categories.OrderBy(u=>u.CategoryName);
model.CategoryList=categories.Select(a=>new SelectListItem
{
Value=a.CategoryID.ToString(),
Text=a.CategoryName.ToString()
});
}
//
//获取:/Ticket/编辑/5
公共操作结果编辑(int id=0)
{
票证=db.Tickets.Find(id);
如果(票证==null)
{
返回HttpNotFound();
}
ViewBag.AllAdmins=db.Users.Where(u=>u.IsAdministrator)。包括(u=>u.Tickets);
回程票;
}
//
//POST:/Ticket/编辑/5
[HttpPost]
[ValidateAntiForgeryToken]
公共行动结果编辑(票证)
{
if(ModelState.IsValid)
{
db.Entry(ticket).State=EntityState.Modified;
db.SaveChanges();
返回操作(“索引”);
}
ViewBag.AllAdmins=db.Users.Where(u=>u.IsAdministrator)。包括(u=>u.Tickets);
回程票;
}
视图\Ticket\Create.cshtml

@model RecreationalServicesTicketingSystem.ViewModels.TicketVM

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Ticket</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.CategoryID, "Category")
        </div>
        <div class="editor-field">
            @Html.DropDownList("CategoryID", String.Empty)
            @Html.ValidationMessageFor(model => model.CategoryID)
        </div>

        <div class="editor-field">
            @using (Html.BeginForm())
            {
                @Html.HiddenFor(m => m.UserID)
                <div class="form-group">
                    @Html.LabelFor(m => m.IssuedTo)
                    @Html.DropDownListFor(m => m.IssuedTo, Model.AdministratorList, "Please select", new { @class = "form-control" })
                    @Html.ValidationMessageFor(m => m.IssuedTo)
                </div>
                <div class="form-group">
                    @Html.LabelFor(m => m.Issue)
                    @Html.TextBoxFor(m => m.Issue, new { @class = "form-control" })
                    @Html.ValidationMessageFor(m => m.Issue)
                </div>
            }
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
</fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
@model RecreationalServicesTicketingSystem.ViewModels.TicketVM

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Ticket</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.CategoryID, "Category")
        </div>


        <div class="editor-field">
            @using (Html.BeginForm())
            {
                @Html.HiddenFor(m => m.UserID)
                <div class="form-group">
                    @Html.DropDownListFor(m => m.CategoryID, Model.CategoryList, "Please select", new { @class = "form-control" })
                </div>
                <div class="form-group">
                    @Html.LabelFor(m => m.IssuedTo)
                    @Html.DropDownListFor(m => m.IssuedTo, Model.AdministratorList, "Please select", new { @class = "form-control" })
                    @Html.ValidationMessageFor(m => m.IssuedTo)
                </div>
                <div class="form-group">
                    @Html.LabelFor(m => m.Issue)
                    @Html.TextBoxFor(m => m.Issue, new { @class = "form-control" })
                    @Html.ValidationMessageFor(m => m.Issue)
                </div>
            }
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
</fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
@model RecreationalServicesTicketingSystem.ViewModels.TicketVM
@{
ViewBag.Title=“创建”;
}
创造
@使用(Html.BeginForm()){
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
票
@LabelFor(model=>model.CategoryID,“Category”)
@使用(Html.BeginForm())
{
@Html.HiddenFor(m=>m.Use