2010-11-06 101 views
0

我知道这是一个我遇到的问题,我不知道如何解决它。我有两个表具有以下结构:SQL错误:插入语句与外键约束冲突

dbo.File 
FileID   int 
Title    nvarchar(50) 
ISBN    nvarchar(50) 
UploadDate  datetime 
UserName   nvarchar(50) 

dbo.Cover 
CoverID   int 
CoverFileContent varbinary(max) 
CoverMimeType  nvarchar(50) 
CoverFileName  nvarchar(50) 
FileID   int 

文件表有一个与盖表一对多的关系,并且在写到FileID封面表引用写到FileID在文件表。

所以我也有一个MVC应用程序。在这种应用中,在一个屏幕上我插入的文件数据,然后在下面的屏幕我上传文件,并将其插入封面表这一点,但是我得到以下错误:

InnerException {"The INSERT statement conflicted with the FOREIGN KEY constraint \"FK_Cover_File\". The conflict occurred in database \"SampleAppDB\", table \"dbo.File\", column 'FileID'.\r\nThe statement has been terminated."} System.Exception {System.Data.SqlClient.SqlException}

我知道这意味着什么,我刚刚空白,我如何实际执行此插入语句以与File表相对应。目前,我没有在Cover表格中插入任何内容到FileID外键,因为我不知道如何去做。下面是从封面控制器的一个片段,其中盖文件的上传情况:

[HttpPost] 
public ActionResult CreateCover(FormCollection formvalues) 
{ 
    Cover cover = new Cover(); 

    cover.CoverMimeType = Request.Files["CoverUpload"].ContentType; 
    Stream fileStream = Request.Files["CoverUpload"].InputStream; 
    cover.CoverFileName = Path.GetFileName(Request.Files["CoverUpload"].FileName); 
    int fileLength = Request.Files["CoverUpload"].ContentLength; 
    cover.CoverFileContent = new byte[fileLength]; 
    fileStream.Read(cover.CoverFileContent, 0, fileLength); 

    filerepository.AddCoverData(cover); 

    filerepository.Save(); 

    return View(cover); 
} 

如何处理这个问题,将不胜感激,如果有人需要我发布更多信息过于任何意见,只问。

按照要求:filerepository.cs

private SampleAppDBEntities entities = new SampleAppDBEntities(); 

     public void AddCoverData(Cover cover) 
     { 
      entities.Covers.AddObject(cover); 
     } 
+0

的你的filerepository对象定义中的与数据库相关的代码会有所帮助。这是linq到sql,nhibernate,直ado.net,其他? – Tahbaza 2010-11-06 11:33:35

+0

@Tahbaza,我已经使用filerepository.cs中的代码片段更新了我的帖子。我正在使用ado.net。 – 109221793 2010-11-06 12:33:54

回答

1

你可以有你的写到FileID值的FormCollection中传递的一个隐藏的参数 然后有一个Cover控制器动作来初始化它。

例如:

从文件详细信息页面添加一个链接来创建一个覆盖

<a href="#" rel='<%= Url.Content("~/Cover/AddCover/FILEID_HERE") %>'>Add cover</a> 

那么你可以有封面控制器上取得动作,简单地初始化盖写到FileID并返回AddCover视图

[HttpGet] 
public ActionResult AddCover(int id) { 
    CoverModel cm = new CoverModel(); 
    cm.FileId = id; 
    return View("AddCover", cm); 
} 

您的封面视图中。最后,应该输入到CoverModel只需将作为写到FileID的隐藏字段,所以你可以把它POS与您的表格数据的其余部分。使用这种模式的

<% using (Html.BeginForm("AddCover", "Cover", FormMethod.Post, new {})) { %> 
    <%= Html.HiddenFor(model => model.FileID) %> 

    //Place your cover form fields here 

<% } %> 

一个效果是可以使用的FormCollection类需要使用MVC的默认模型绑定功能的优势,有一个帖子的动作像这样的,而不是:

[HttpPost] 
public ActionResult AddCover(CoverModel model) { 
    //Validate your data and tehn add to database 
} 
+0

嗨洛伦佐,感谢您的回复!我遵循了您的所有建议,除了:CoverModel cm = new CoverModel(id);.我无法添加变量ID,因为我收到以下消息:“'SampleApp.Models.Cover'不包含带1个参数的构造函数”...我添加了“cover.FileID = int。解析(Request.Form [“FileID”]);“到POST CreateCover ActionResult然而,当我点击提交/上传时,我得到了与我原来发布的外键相同的错误,任何想法? – 109221793 2010-11-06 12:54:32

+0

也是@Lorenzo根据您的示例使用链接,我已经将这行代码插入到我的POST createFile ActionResult中:“return RedirectToAction(”CreateCover“,”Cover“,new {id = file.FileID});”..这使我到CreateCover页面的URL中,这个URL看起来是正确的 – 109221793 2010-11-06 13:07:24

+0

对不起,发送垃圾邮件给你,我已经解决了这个问题,我把表格中的行改为“<%:Html.HiddenFor(model => model.File.FileID)%>“...但是现在我收到一个错误,说它是空的 – 109221793 2010-11-06 13:16:28

1

您需要发布相关的这个盖到控制器动作的fileid:

cover.File = filerepository.GetFile(fileId); 
+0

或cover.FileId = fileId; – 2010-11-06 15:13:24

相关问题