C# INSERT语句与外键约束冲突

C# INSERT语句与外键约束冲突,c#,sql,asp.net-mvc,entity-framework,C#,Sql,Asp.net Mvc,Entity Framework,我目前正在学习ASP.NET MVC应用程序。基本上,我用EF创建了一个名为“餐厅评论”的MVC4应用程序。但是,当我创建一个新的评论时,它会显示一个错误。我知道一定是我错过了什么 错误是 INSERT语句与外键约束“FK_dbo.ResturantReviews_dbo.Resturants_Resturant_Id”冲突。冲突发生在数据库“OdeToFoodDb”、表“dbo.Resturants”的列“Id”中。 本声明已终止。** 下面显示了我的层次结构 模型 看法 @model Ode

我目前正在学习ASP.NET MVC应用程序。基本上,我用EF创建了一个名为“餐厅评论”的MVC4应用程序。但是,当我创建一个新的评论时,它会显示一个错误。我知道一定是我错过了什么

错误是

INSERT语句与外键约束“FK_dbo.ResturantReviews_dbo.Resturants_Resturant_Id”冲突。冲突发生在数据库“OdeToFoodDb”、表“dbo.Resturants”的列“Id”中。 本声明已终止。**

下面显示了我的层次结构

模型

看法

@model OdeToFood.Models.Resturant
@{
ViewBag.Title=“Index”;
}
审查@Model.Name
@Html.Partial(“_Reviews”,Model.Reviews)

@ActionLink(“createnew”,“Create”,New{restaurantId=Model.Id})


我认为餐馆有问题。尝试添加检查是否存在已审核的餐厅。我还建议为您的模型添加验证属性,如
[必需]

此问题可能由实体框架引起。检查您的审核实体中是否有“餐厅”字段。如果是这样的话,在保存评论之前将其赋值为null(只需将ID保留在RestaurantId字段中)

在某些情况下,EF认为一个分离的实体是一个新的实体(例如,如果我们得到一个内部餐厅的评论),并尝试将其添加到数据库中,得到一个异常,因为完全相同的实体已经存在。如果我们不需要它,我们必须阻止它拯救餐厅,所以我们应该只保存评论

另外,正如其他人所提到的,您可能只是在不存在的餐厅中添加一个评论(不确定是否适合您,我想这种问题很容易发现)


如果对您有帮助,请告诉我。

我认为您的
餐厅
表的
Id
属性不是唯一的或主键。请先检查并重试。

添加以下属性

public int RestaurantId { get; set; } 
RestaurantReview
model类中

并在pakage manager控制台中更新数据库-详细


现在构建并运行。这将解决问题。

看起来您正在尝试对不存在的餐厅创建评论。您是否已调试到
create
方法以确保
review.RestaurantId
包含有效标识符?您的
create()
GET方法没有将
restaurantId
的值传递给视图,因此当您提交表单时,
review.restaurantId
的值为
0
,因此您会得到错误。在您的视图中使用视图模型,而不是数据模型。为什么您有
公共操作结果索引([Bind(Prefix=“id”)]int restaurantId)
?If应该是public ActionResult Index(int-id)
public class ReviewsController : Controller
{
    private readonly OdeToFoodDb _db = new OdeToFoodDb();

    public ActionResult Index([Bind(Prefix = "id")]int restaurantId)
    {
        var restaurant = _db.Resturants.Find(restaurantId);
        if (restaurant != null)
        {
            return View(restaurant);
        }
        return HttpNotFound();
    }

    [HttpGet]
    public ActionResult Create(int restaurantId)
    {
        return View();
    }

    [HttpPost]
    public ActionResult Create(ResturantReview review)
    {
        if (ModelState.IsValid)
        {
            _db.Reviews.Add(review);
            _db.SaveChanges();
            return RedirectToAction("Index", new { id = review.ResturantId });
        }
        return View(review);
    }
@model OdeToFood.Models.Resturant

@{
    ViewBag.Title = "Index";
}

<h2>Review For @Model.Name</h2>

@Html.Partial("_Reviews", Model.Reviews)
<p>
    @Html.ActionLink("Create New", "Create", new {restaurantId = Model.Id})
</p>
public int RestaurantId { get; set; }