SaveChanges()与FOREIGN KEY冲突

时间:2015-11-24 15:53:46

标签: c# asp.net-mvc entity-framework foreign-keys visual-studio-2015

我试着做这个官方教程:

http://docs.asp.net/en/latest/tutorials/your-first-aspnet-application.html

在运行应用程序时,我可以创建作者。但是,如果我尝试创建Books,则会在BooksController.cs(从Scaffolded Item生成)中抛出异常。

_context.SaveChanges()

当调试器遇到上述代码中的\"FK_Book_Author_AuthorID\"行时,我收到以下异常消息:

  

INSERT语句与FOREIGN KEY约束using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace ContosoBooks.Models { public class Author { public int AuthorID { get; set; } [Required] [Display(Name = "Last Name")] public string LastName { get; set; } [Display(Name = "First Name")] public string FirstMidName { get; set; } public virtual ICollection<Book> Books { get; set; } } } 冲突。   冲突发生在数据库\&#34; aspnet5-ContosoBooks-6c8514e9-1385-411c-bc72-2620ec2f43ec \&#34;,table \&#34; dbo.Author \&#34;,column&#39; AuthorID& #39;&#34;}

我新创作的书似乎有问题。此项目没有Authors表的AuthorID外键。

这只是为了我,还是我做错了什么?如何在我刚刚提到的示例中修复此外键异常?

现在我的Author.cs看起来像这样

@model ContosoBooks.Models.Book

@{
    ViewData["Title"] = "Create";
}

<h2>Create</h2>

<form asp-action="Create">
    <div class="form-horizontal">
        <h4>Book</h4>
        <hr />
        <div asp-validation-summary="ValidationSummary.ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="AuthorID" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <select asp-for="AuthorID" class ="form-control"></select>
            </div>
        </div>
        <div class="form-group">
            <label asp-for="Genre" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="Genre" class="form-control" />
                <span asp-validation-for="Genre" class="text-danger" />
            </div>
        </div>
        <div class="form-group">
            <label asp-for="Price" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="Price" class="form-control" />
                <span asp-validation-for="Price" class="text-danger" />
            </div>
        </div>
        <div class="form-group">
            <label asp-for="Title" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="Title" class="form-control" />
                <span asp-validation-for="Title" class="text-danger" />
            </div>
        </div>
        <div class="form-group">
            <label asp-for="Year" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="Year" class="form-control" />
                <span asp-validation-for="Year" class="text-danger" />
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
</form>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
    <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
}

我对创作书的看法

record.twig

2 个答案:

答案 0 :(得分:1)

您的问题是,您未给Book book参数AuthorID。根据您正在查看的示例,Book模型在Book模型中的[ScaffoldColumn(false)]上方public int AuthorID。这意味着当您使用generated from Scaffolded Item方法时,此字段将不会创建输入。删除[ScaffoldColumn(false)]并重新生成图书的控制器/视图..或者只是手动将字段添加到图书视图中。

如果您正在尝试学习MVC,可能需要尝试本教程http://pluralsight.com/training/Player?author=scott-allen&name=mvc4-building-m6-ajax&mode=live&clip=0&course=mvc4-building

答案 1 :(得分:0)

您的图书模型与模型作者有关系,因为我正在查看您引用的链接,图书模型具有AuthorId。

您需要在保存时提供AuthorId来预订模型,或者您需要首先保存作者,然后获取保存的AuthorId并在Book模型中设置。 (按照你的模特,一本书必须有一个作者)。