2016-04-29 16 views
-1

現在、ASP.NET MVCアプリケーションを学習しています。基本的に私はレストランレビューと呼ばれるEFでMVC 4アプリを作成しました。しかし、新しいレビューを作成すると、エラーが表示されます。私はそれが私が逃したものでなければならないことを知っているINSERTステートメントがFOREIGN KEY制約と競合しました

エラーがFOREIGN KEY制約 "FK_dbo.ResturantReviews_dbo.Resturants_Resturant_Id" と競合

INSERT文です。競合は、データベース "OdeToFoodDb"、テーブル "dbo.Resturants"、列 'Id'で発生しました。 この声明は終了しました。**

以下は私の階層を示しています。

モデル

public class Resturant 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string City { get; set; } 
    public string Country { get; set; } 
    public virtual ICollection<ResturantReview> Reviews { get; set; } 
} 

public class ResturantReview 
{ 
    public int Id { get; set; } 
    public int Rating { get; set; } 
    public string Body { get; set; } 
    public string ReviewerName { get; set; } 
    public int ResturantId { get; set; } 
} 

コントローラ

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> 
+1

存在しないレストランでレビューを作成しようとしているようです。 – DrewJordan

+0

あなたの 'Create'メソッドをデバッグして' review.RestaurantId'に有効な識別子が含まれていることを確認しましたか? –

+0

あなたの 'Create()' GETメソッドは 'restaurantId'の値をビューに渡さないので、フォームを送信すると' review.ResturantId'の値は '0'なので、エラーになります。また、データモデルではなく、ビュー内でビューモデルを使用してください。 –

答えて

0

あなたのRestaurantテーブルのプロパティがIdと思うのですが、一意のキーではありません。最初に確認してからもう一度お試しください。

0

私はレストランに問題があると思います。レビューされたレストランが存在するかどうかのチェックを追加してください。また、[Required]のように、モデルの検証属性を追加することをお勧めします。

0

この問題は、Entity Frameworkによって発生する可能性があります。 Reviewエンティティの中にRestaurantフィールドがあるかどうかを確認します。その場合は、Reviewを保存する前にnullを割り当ててください(IDはRestaurantIdフィールドのままにしてください)。

EFは、分離されたエンティティが(レストラン内でレビューを取得している場合など)新しいものであると考え、データベースに追加しようとします。例外は同じエンティティが既に存在するためです。レストランが必要ない場合はレストランを保存しないようにしなければならないので、レビューを保存するだけです。

他の人が述べたようにまた、あなただけの存在ではないレストランにレビューが追加される場合があります(それはあなたのためのケースだかどうかわからない、私はこの種の問題は、検出が容易であると仮定)

、私を知ってみましょうそれがあなたに役立つ/しない場合。

関連する問題