There are two tables: a news table and a table of pictures. In the table of pictures there is a NewsId field which is associated with a news Id .
Here is the model:
public class RelNewsDto { public int Id { get; set; } public string Title { get; set; } public string Body { get; set; } public virtual ICollection<NewsImageDto> NewsImages { get; set; } } public class NewsImageDto { public int Id { get; set; } public byte[] ImageItem { get; set; } public int NewsId { get; set; } } I can't figure out how to add images to the NewsImages collection NewsImages
Here is what happens in View:
@using (Html.BeginForm("RelNewsCreate", "News", FormMethod.Post, new { enctype = "multipart/form-data" })) { <h4>Title</h4> @Html.TextBoxFor(model => model.Title, new { @class = "form-control", required = "required", autocomplete = "off" }) <br /> <h4>Images</h4> @Html.TextBoxFor(Model => Model.NewsImages, new { type = "file", name = "uploadImage", min = "1", max = "9999", multiple = "true" }) <br /> <h4>Article</h4> @Html.TextAreaFor(model => model.Body, 20, 0, new { @class = "form-control", required = "required", autocomplete = "off" }) <br /> <input type="submit" value="Save" class="btn btn-success" id="btn-save" /> } This is what happens in the controller:
[HttpPost] public ActionResult RelNewsCreate(BLL.Model.RelNewsViewModelItem item) { BLL.Providers.RelNewsBdProvider dbProv = new BLL.Providers.RelNewsBdProvider(); for (var i = 0; i < Request.Files.Count; i++) { var image = Request.Files[i]; if (image != null) { byte[] imageData = null; using (var binaryReader = new BinaryReader(image.InputStream)) { imageData = binaryReader.ReadBytes(image.ContentLength); item.NewsImages.Add(new BLL.Model.NewsImageViewModelItem { NewsId = item.Id, ImageItem = imageData }); } } } dbProv.Add(item); return RedirectToAction("RelNews"); } Business Logic Layer:
public void Add(RelNewsViewModelItem newsItem) { dbProv.Add(MapDtoToDb(newsItem)); } public RelNewsDto MapDtoToDb(RelNewsViewModelItem dbItem) { if (dbItem != null) { return new RelNewsDto { Id = dbItem.Id, Title = dbItem.Title, Body = dbItem.Body, NewsImages = dbItem.NewsImages.Select(MapNewsImageDto).ToList() }; } return null; } Data Access Layer:
public void Add(RelNewsDto newsItem) { using (var db = new DataBaseDataContext()) { db.NewsVs.InsertOnSubmit(MapDtoToDb(newsItem)); var images = newsItem.NewsImages.Select(x => new NewsImage() { Id = x.Id, ImageItem = x.ImageItem, NewsId = newsItem.Id }).ToList(); db.NewsImages.InsertAllOnSubmit(images); db.SubmitChanges(); } } public NewsV MapDtoToDb (RelNewsDto dbItem) { if (dbItem != null) { return new NewsV { Id = dbItem.Id, Title = dbItem.Title, Body = dbItem.Body }; } return null; } Reaches the last line ( db.SubmitChanges(); ) and gives an exception:
System.Data.SqlClient.SqlException l System.Data.Linq.dll but it is not handled in user code
Additional information: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_NewsImage_NewsV". Occurred in database "Schedule", table "dbo.NewsV", column 'Id'.
I do not understand how to correct the error.