Работа с реляционной БД ASP.NET

329
21 июля 2017, 00:56

Есть два таблицы: таблица новостей и таблица картинок. В таблице картинок есть поле NewsId которое связано с Id новостей.

Вот модель:

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; }
}

Я не могу разобраться, как добавлять картинки в коллекцию NewsImages

Вот, что происходить во 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" />
}

Вот, что происходит в контроллере:

    [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;
    }

Доходит до последней строчки (db.SubmitChanges();) и выдает exception:

An exception of type 'System.Data.SqlClient.SqlException' occurred in >System.Data.Linq.dll but was not handled in user code

Additional information: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_NewsImage_NewsV". The conflict occurred in database "Schedule", table "dbo.NewsV", column 'Id'.

Не понимаю, как исправить ошибку.

Answer 1

Ошибки больше нет.

public void Add(RelNewsDto newsItem)
{
    using (var db = new DataBaseDataContext())
    {
        var item = MapDtoToDb(newsItem);
        var images = newsItem.NewsImages.Select(MapNewsImage).ToList();
        db.NewsVs.InsertOnSubmit(item);
        item.NewsImages.AddRange(images);
        db.SubmitChanges();
    }
}
READ ALSO
Оптимизировать код c#

Оптимизировать код c#

Добрый день, нужна ваша помощь в оптимизации кодаЗадача : зашифровать часть байтов в файле алгоритмом aes c# Как я сделал:

253
Как реализовать многопоточный брут на c#?

Как реализовать многопоточный брут на c#?

У меня есть база логинов, паролей, портов и ip адресовСуть в том, что нужно реализовать отдельный перебор для каждого ip адреса в потоках

380
Авторизация в ВК через запрос к api

Авторизация в ВК через запрос к api

При попытке провести авторизацию через запрос к апи - получаю ответ с сервер 401В связи с тем что нужно использовать определенные юзер-агенты,от...

549