2010-11-06 3 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 в таблице Cover ссылающийся 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}

Я знаю, что это значит , Я просто забыл, как я на самом деле выполняю эту инструкцию insert, чтобы соответствовать таблице файлов. В настоящее время я не вставляю ничего в внешний ключ FileID в таблице Cover, потому что я не уверен, как это сделать. Вот отрывок из контроллера обложки, где загрузка файла обложки происходит:

[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

db-связанный код в определении объекта filerepository. Это linq-to-sql, nhibernate, прямой ado.net, другой? – Tahbaza

+0

@Tahbaza, я обновил свое сообщение с помощью фрагмента от filerepository.cs. Я использую ado.net. – 109221793

ответ

1

Вы могли бы FILEID прошло в пределах ваших значений FormCollection, как скрытый параметр , а затем выполните действие контроллера крышки, которое инициализирует его.

Например:

От странице детали файла добавить ссылку, чтобы создать крышку

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

, то вы можете иметь действие Встаньте на контроллере Cover, который просто инициализирует крышку FILEID и вернуть AddCover вид

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

Наконец в вашем Cover View, который должен быть набран в CoverModel просто добавить FILEID как скрытое поле, так что вы можете иметь его поз с остальными данными вашей формы.

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

    //Place your cover form fields here 

<% } %> 

Один эффекта использования этого шаблона является то, что вы можете воспользоваться помощью функций модели по умолчанию связующего MVC и иметь запись действия, как этот, вместо того, чтобы использовать класс FormCollection:

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

Привет Лоренцо, спасибо за ответ! Я выполнил все ваши советы, за исключением: CoverModel cm = new CoverModel (id) ;. Я не смог добавить идентификатор переменной, поскольку получил следующее сообщение: «SampleApp.Models.Cover» не содержит конструктор, который принимает 1 аргумент «... Я добавил» cover.FileID = int.Parse (Request.Form ["FileID"]); "в POST CreateCover ActionResult, однако, когда я нажимаю submit/upload, я получаю ту же ошибку re. Внешние ключи в соответствии с моим оригинальным сообщением. Любые идеи? – 109221793

+0

также, @Lorenzo, Вместо этого используя ссылку в соответствии с вашим примером, я вставил эту строку кода в мой POST createFile ActionResult: «return RedirectToAction (« CreateCover »,« Cover », new {id = file.FileID});« Это приносит мне на страницу CreateCover с идентификатором в URL-адресе, который кажется до сих пор. – 109221793

+0

Извините, что спам вас, я разобрал эту конкретную проблему, я изменил строку в форме на «<%: Html.HiddenFor (модель => model.File.FileID)%> "... но теперь я получаю ошибку, чтобы сказать, что она равна нулю. – 109221793

1

Вы должны опубликовать FILEID, связанный с этой крышкой в ​​действие контроллера:

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

или cover.FileId = fileId; –

Смежные вопросы