Ошибка SQL: оператор вставки конфликтует с ограничением внешнего ключа - PullRequest
0 голосов
/ 06 ноября 2010

Я знал, что это проблема, с которой я столкнусь, и я просто не знаю, как ее решить. У меня есть две таблицы со следующими структурами:

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 {"оператор INSERT в конфликте с иностранным ключом ограничение \ "FK_Cover_File \". конфликт произошел в базе данных \ "SampleAppDB \", таблица \ "dbo.File \", столбец 'FileID'. \ r \ nУправление было прекращено. "} System.Exception {System.Data.SqlClient.SqlException}

Я знаю, что это значит, я просто не указал, как на самом деле я выполняю этот оператор вставки, чтобы соответствовать таблице файлов. В настоящее время я не вставляю ничего во внешний ключ 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);
        }

Ответы [ 2 ]

1 голос
/ 06 ноября 2010

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

Например:

На странице сведений о файле добавьтессылка для создания Cover

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

, тогда вы можете получить действие get на контроллере 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
}
1 голос
/ 06 ноября 2010

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

cover.File = filerepository.GetFile(fileId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...