2012-12-21 63 views
0

我得到这个错误就行了错误:INSERT语句冲突与外键约束

db.Comments.Add(comment); 
db.SaveChanges(); 

,我不能修复它...有什么问题?我已经阅读了关于该问题的许多问题,但无法从代码中发现问题的来源。

我使用的是asp.net mvc4,c#和Entity Framework。

我的评论模型有一个PostId属性。

INSERT语句冲突与外键约束 “FK_dbo.Comments_dbo.Posts_PostId”。冲突发生在 数据库Myproject中,表“dbo.Posts”,列'PostId'。
该声明已被终止。

编辑:

我注意到,我的comment.PostId等于0时,调用SaveChanges()被调用

我发现,如果我在我的CreateComment视图中有@Html.HiddenFor(model => model.PostId),那么我再也没有错误了,但是当我点击添加评论时没有任何反应

PostController

 public ActionResult ListPost() 
     { 
      var post = db.Posts.ToList(); 
      return PartialView("ListPost", post); 
     } 


     public ActionResult Create() 
     { 
      return View(); 
     } 


     [HttpPost] 
     public ActionResult Create(FormCollection values) 
     { 
      var post = new Post(); 
      TryUpdateModel(post); 

      if (ModelState.IsValid) 
      { 
       var context = new UsersContext(); 
       var username = User.Identity.Name; 
       var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username); 
       var userid = user.UserId;     

       post.UserId = userid; 
       post.Date = DateTime.Now; 

       db.Posts.Add(post); 
       db.SaveChanges(); 
       return RedirectToAction("Create", "Post"); 
      } 
      return View(post); 
     } 


    public ActionResult CreateComment() 
    { 
     ViewBag.PostId = new SelectList(db.Posts, "PostId", "Content"); 
     return View("CreateComment"); 
    } 

    [HttpPost] 
    public ActionResult CreateComment(FormCollection values) 
    { 
     var comment = new Comment(); 
     TryUpdateModel(comment); 

     if (ModelState.IsValid) 
     { 
      var context = new UsersContext(); 
      var username = User.Identity.Name; 
      var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username); 
      var userid = user.UserId; 

      comment.UserId = userid; 
      comment.Date = DateTime.Now; 

      db.Comments.Add(comment); 
      db.SaveChanges(); 
      return RedirectToAction("Create", "Post"); 
     } 
     ViewBag.PostId = new SelectList(db.Posts, "PostId", "Content", comment.PostId); 
     return View(comment); 
    } 

创建视图(调用ListPost局部视图):

@model Myproject.Models.Post 

@using (Html.BeginForm("Create", "Post", FormMethod.Post)) 
{ 
     <legend>Add Post</legend> 

     <div class="editor-field"> 
      @Html.EditorFor(model => model.Content) 
      @Html.ValidationMessageFor(model => model.Content) 
      <input type="file" name="Photo" id="Photo"/> 
     </div> 

     <p> 
      <input type="submit" value="Post" /> 
     </p> 
} 

@{Html.RenderAction("ListPost", "Post");} 

ListPost局部视图(调用CreateComment视图):

@model IEnumerable<MyProject.Models.Post> 

    @foreach (var item in Model.OrderByDescending(x => x.Date)) 
    { 
     <tr> 
      <td> 
       @Html.DisplayFor(modelItem => item.Content) 
      </td> 
     </tr> 
     <tr> 
      <td> 
       @Html.DisplayFor(modelItem => item.Date) 
      <span>@Html.DisplayFor(modelItem => item.Users.UserName)</span>  
      </td> 
     </tr> 

    <tr> 
     <td> @Html.ActionLink("Add Comment", "CreateComment", new {id=item.PostId})</td>  
    </tr> 
} 

编辑2

文章页数:

CREATE TABLE [dbo].[Posts] (
    [PostId] INT    IDENTITY (1, 1) NOT NULL, 
    [UserId] INT    NOT NULL, 
    [Content] NVARCHAR (MAX) NULL, 
    [Date] DATETIME  NOT NULL, 
    [Picture] VARBINARY (MAX) NULL, 
    CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([PostId] ASC), 
    CONSTRAINT [FK_dbo.Posts_dbo.UserProfile_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[UserProfile] ([UserId]) ON DELETE CASCADE 
); 


GO 
CREATE NONCLUSTERED INDEX [IX_UserId] 
    ON [dbo].[Posts]([UserId] ASC); 

评论表

CREATE TABLE [dbo].[Comments] (
    [CommentId] INT   IDENTITY (1, 1) NOT NULL, 
    [UserId] INT   NOT NULL, 
    [PostId] INT   NOT NULL, 
    [Content] NVARCHAR (MAX) NULL, 
    [Date]  DATETIME  NOT NULL, 
    CONSTRAINT [PK_dbo.Comments] PRIMARY KEY CLUSTERED ([CommentId] ASC), 
    CONSTRAINT [FK_dbo.Comments_dbo.Posts_PostId] FOREIGN KEY ([PostId]) REFERENCES [dbo].[Posts] ([PostId]) ON DELETE CASCADE 
); 


GO 
CREATE NONCLUSTERED INDEX [IX_PostId] 
    ON [dbo].[Comments]([PostId] ASC); 

谢谢

+0

add PostId在哪里设置。调用savechanges时它是空还是默认?该字段是否标记为DB上的标识? –

+0

@soadyp我应该在哪里添加PostId设置?我真的不知道如何查看它是否为空或默认值。是的,我的PostId字段在我的发布表中标记为身份,在我的评论表中显示为FK。 – AlternateChris

+0

@soadyp所以,当调用savechanges时,我的PostId等于0 – AlternateChris

回答

1

应设置帖子ID属性上您的评论型号:

[HttpPost] 
    public ActionResult CreateComment(FormCollection values) 
    { 
     var comment = new Comment(); 
     TryUpdateModel(comment); 

     if (ModelState.IsValid) 
     { 
      var context = new UsersContext(); 
      var username = User.Identity.Name; 
      var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username); 
      var userid = user.UserId; 

      comment.UserId = userid; 
      comment.Date = DateTime.Now; 
      //here 
      comment.PostId = values["postId"]; 

      db.Comments.Add(comment); 
      db.SaveChanges(); 
      return RedirectToAction("Create", "Post"); 
     } 
     ViewBag.PostId = new SelectList(db.Posts, "PostId", "Content", comment.PostId); 
     return View(comment); 
    } 
+0

什么意思'价值[“postId”]'?它是否涉及输入字段?像postId的隐藏输入,例如 – AlternateChris

+0

它告诉我它不能将源类型“字符串”转换为目标类型“int”。 – AlternateChris

1

最后,我改变我的CreateComment解决问题(httpPost)ActionResult与以下内容:

[HttpPost] 
    public ActionResult CreateComment(FormCollection values, int id) 
    { 
     var comment = new Comment(); 
     TryUpdateModel(comment); 

     /** ADD THIS LINE **/ 
     Post post = db.Posts.Find(id); 

     if (ModelState.IsValid) 
     { 
      var context = new UsersContext(); 
      var username = User.Identity.Name; 
      var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username); 
      var userid = user.UserId; 

      comment.UserId = userid; 
      comment.Date = DateTime.Now; 

      /*** ADD THIS TWO LINES ***/ 
      comment.Post = post; 
      comment.PostId = post.PostId; 

      db.Comments.Add(comment); 
      db.SaveChanges(); 
      return RedirectToAction("Create", "Post"); 
     }    
     ViewBag.PostId = new SelectList(db.Posts, "PostId", "Content", comment.PostId); 
     return View(comment); 
    } 
相关问题