Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 49

Исключение при изменении (редактировании данных) таблицы в БД

08.01.2017, 19:42. Показов 3805. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
в бд 3 таблицы, таблицы новостей сущности у них идентичные

один из них:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
namespace WebApplication6.Models
{
    public class WorldNews
    {
        public int Id { get; set; }
        public string NameMan { get; set; }
 
        [DataType(DataType.MultilineText)]
        public string Message { get; set; }
        public DateTime? DateAdded { get; set; }
        public string Name { get; set; }
        public byte[] Image { get; set; }
        public bool Checkbox1 { get; set; }
        public bool Checkbox2 { get; set; }
        public bool Checkbox3 { get; set; }
    }
}
IdentityModels.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("madconnect")//DB_A13FC4_madproject_admin
        {
        }
        public DbSet<WorldNews> WorldNewses { get; set; }
        public DbSet<ItNews> ItNewses { get; set; }
        public DbSet<UzbNews> 1Newses { get; set; }
        public DbSet<Contact> Contacts { get; set; }
        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }
}
один из методов редактирования контроллера их 3
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
   [Authorize(Roles = "admin")]
        [HttpGet]
        public ActionResult Edit1(int Id )
        {
           
            
 
                var picture = db.1Newses.Find(Id);
 
                return View(picture);
             
            
        }
        [Authorize(Roles = "admin")]
        [HttpPost]
        [ValidateAntiForgeryToken]
        [ValidateInput(false)]
        public ActionResult Edit1([Bind(Include = "Id,NameMan,Message,DateAdded,Name,Image,Checkbox1,Checkbox2,Checkbox3")] 1News pic, HttpPostedFileBase uploadImage)
        {
            
 
            if (ModelState.IsValid && uploadImage != null)
            {
           
                byte[] imageData = null;
           
                using (var binaryReader = new BinaryReader(uploadImage.InputStream))
                {
                    imageData = binaryReader.ReadBytes(uploadImage.ContentLength);
                }
   
                pic.Image = imageData;
               
 
             db.Entry(pic).State = EntityState.Modified;
              
 
                db.SaveChanges();
                return RedirectToAction("Index");
            }
 
            return View(pic);
        }
Исключение типа "System.InvalidOperationException" возникло в EntityFramework.dll, но не было обработано в коде пользователя

Дополнительные сведения: Не удалось присоединить сущность типа "WebApplication6.Models.1News", поскольку другая сущность этого же типа уже имеет такое же значение первичного ключа. Такое возможно при использовании метода "Attach" или задании сущности состояния "Unchanged" или "Modified", если какие-либо сущности в графе имеют конфликтующие значения ключей. Такое возможно из-за того, что некоторые сущности являются новыми и пока еще не получили значения ключей, сформированные базой данных. В этом случае используйте метод "Add" или состояние сущности "Added" для отслеживания графа, а затем задайте сущностям, которые не являются новыми, состояние "Unchanged" или "Modified".

когда была одна таблица всё работало нормально потом как создал еще 2 одинаковых выходит такая вот проблема

Добавлено через 43 минуты
view
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
@model WebApplication6.Models.1News
 
@{
    ViewBag.Title = "Edit";
}
<section class="contact m-t-30">
<div class="container">
 
    <!-- REGISTER -->
    <div class="col-md-8">
        <div class="widget">
            <div class="widget-body">
                <div class="row">
                    @using (Html.BeginForm("EditUz", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
                    {
                        @Html.AntiForgeryToken()
                        <div class="form-horizontal">
                            @Html.CheckBoxFor(m => m.Checkbox1, true) uzb
                            @Html.CheckBoxFor(m => m.Checkbox2) world
                            @Html.CheckBoxFor(m => m.Checkbox3) it
                            @if (Model.Image != null)
                            {   @Html.EditorFor(model => model.Id)
                                @Html.Raw("<img style='width:180px; height:160px; float:left; ' src="data:image/jpeg;base64,"
                                          + Convert.ToBase64String(Model.Image) + "" />")}
                                <hr />
                                @Html.ValidationSummary(true)
                                @Html.HiddenFor(model => model.Id)
 
                                <div class="form-group">
                                    @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
                                    <div class="col-md-10">
                                        @Html.EditorFor(model => model.Name,new { @class = "form-control" })
                                        @Html.ValidationMessageFor(model => model.Name)
                                    </div>
                                </div>
                                <div class="form-group">
                                    @Html.LabelFor(model => model.DateAdded, new { @class = "control-label col-md-2" })
                                    <div class="col-md-10">
                                        @Html.EditorFor(model => model.DateAdded,new { @class = "form-control" })
                                        @Html.ValidationMessageFor(model => model.DateAdded)
                                    </div>
                                </div>
                                <div class="form-group">
                                    @Html.LabelFor(model => model.NameMan, new { @class = "control-label col-md-2" })
                                    <div class="col-md-10">
                                        @Html.EditorFor(model => model.NameMan,new { @class = "form-control" })
                                        @Html.ValidationMessageFor(model => model.NameMan)
                                    </div>
                                </div>
                                <div class="form-group">
                                    @Html.LabelFor(model => model.Message, new { @class = "control-label col-md-2" })
                                    <div class="col-md-10">
                                        @Html.EditorFor(model => model.Message,new {
                                       @class = "form-control",
                                       TextBoxMode = "MultiLine",
 
                                       style = "height:78px; width: 422px;"
                                   })
                                        @Html.ValidationMessageFor(model => model.Message)
                                        <script type="text/javascript">CKEDITOR.replace("Message");</script>
                                    </div>
                                </div>
                                <input type="file" name="uploadImage" />
                                @*Genre and Price removed for brevity.*@
                                <div class="form-group">
                                    <div class="col-md-offset-2 col-md-10">
                                        <input type="submit" value="Save" class="btn btn-default" />
                                    </div>
                                </div>
                                </div>
                    }
                                </div>
                                </div>
                                </div>
                                </div>
                                </div>
</section>
Добавлено через 39 секунд
view
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
@model WebApplication6.Models.1News
 
@{
    ViewBag.Title = "Edit";
}
<section class="contact m-t-30">
<div class="container">
 
    <!-- REGISTER -->
    <div class="col-md-8">
        <div class="widget">
            <div class="widget-body">
                <div class="row">
                    @using (Html.BeginForm("EditUz", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
                    {
                        @Html.AntiForgeryToken()
                        <div class="form-horizontal">
                            @Html.CheckBoxFor(m => m.Checkbox1, true) uzb
                            @Html.CheckBoxFor(m => m.Checkbox2) world
                            @Html.CheckBoxFor(m => m.Checkbox3) it
                            @if (Model.Image != null)
                            {   @Html.EditorFor(model => model.Id)
                                @Html.Raw("<img style='width:180px; height:160px; float:left; ' src="data:image/jpeg;base64,"
                                          + Convert.ToBase64String(Model.Image) + "" />")}
                                <hr />
                                @Html.ValidationSummary(true)
                                @Html.HiddenFor(model => model.Id)
 
                                <div class="form-group">
                                    @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
                                    <div class="col-md-10">
                                        @Html.EditorFor(model => model.Name,new { @class = "form-control" })
                                        @Html.ValidationMessageFor(model => model.Name)
                                    </div>
                                </div>
                                <div class="form-group">
                                    @Html.LabelFor(model => model.DateAdded, new { @class = "control-label col-md-2" })
                                    <div class="col-md-10">
                                        @Html.EditorFor(model => model.DateAdded,new { @class = "form-control" })
                                        @Html.ValidationMessageFor(model => model.DateAdded)
                                    </div>
                                </div>
                                <div class="form-group">
                                    @Html.LabelFor(model => model.NameMan, new { @class = "control-label col-md-2" })
                                    <div class="col-md-10">
                                        @Html.EditorFor(model => model.NameMan,new { @class = "form-control" })
                                        @Html.ValidationMessageFor(model => model.NameMan)
                                    </div>
                                </div>
                                <div class="form-group">
                                    @Html.LabelFor(model => model.Message, new { @class = "control-label col-md-2" })
                                    <div class="col-md-10">
                                        @Html.EditorFor(model => model.Message,new {
                                       @class = "form-control",
                                       TextBoxMode = "MultiLine",
 
                                       style = "height:78px; width: 422px;"
                                   })
                                        @Html.ValidationMessageFor(model => model.Message)
                                        <script type="text/javascript">CKEDITOR.replace("Message");</script>
                                    </div>
                                </div>
                                <input type="file" name="uploadImage" />
                                @*Genre and Price removed for brevity.*@
                                <div class="form-group">
                                    <div class="col-md-offset-2 col-md-10">
                                        <input type="submit" value="Save" class="btn btn-default" />
                                    </div>
                                </div>
                                </div>
                    }
                                </div>
                                </div>
                                </div>
                                </div>
                                </div>
</section>


Добавлено через 39 минут
@using (Html.BeginForm("Edit1", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) так правильнее
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.01.2017, 19:42
Ответы с готовыми решениями:

Получение данных из таблицы при редактировании
здраствуйте! пожалуйста помогите с данной задачой, создал в form1: dbgrid, adoconnection, adoquery и все прекрасно работает, но при...

Исключение при редактировании ячейки
Здравствуйте. При попытке редактировать ячейки в datagrid вылезает исключение: System.InvalidOperationException:...

Исключение при редактировании строки в DataGrid
При попытке редактировать ячейку строки в &quot;DataGrid&quot;, происходит исключение. Данные в таблицу добавляю таким образом: private void...

19
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,946
09.01.2017, 09:52
MadEagle, почитай внимательно, как обновлять сущности.
1
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
09.01.2017, 10:54
Первичный ключ атрибут забыл указать , ну и на уровне БД он должен генерироваться уникальным.
1
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,946
09.01.2017, 11:37
А ещё желательно сделать db.1Newses.Attach(pic) ибо имеет место disconnected scenario.
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 49
09.01.2017, 15:07  [ТС]
Usaga, остальные две таблицы обновляются без проблем а первая всё еще ругается не понимаю почему
та что не меняется
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 [Authorize(Roles = "admin")]
        [HttpGet]
        public ActionResult Edit(int Id)
        {
 
 
            var picture = db.Pictures.Find(Id);
 
            return View(picture);
        }
        [Authorize(Roles = "admin")]
        [HttpPost]
        [ValidateAntiForgeryToken]
        [ValidateInput(false)]
        public ActionResult Edit([Bind(Include = "SitenewsId,NameMan,Message,DateAdded,Name,Image,Checkbox1,Checkbox2,Checkbox3")] Picture picture, HttpPostedFileBase uploadImage)
        {
            if (ModelState.IsValid && uploadImage != null)
            {
                byte[] imageData = null;
           
                using (var binaryReader = new BinaryReader(uploadImage.InputStream))
                {
                    imageData = binaryReader.ReadBytes(uploadImage.ContentLength);
                }
                picture.DateAdded = DateTime.Now;
                picture.Image = imageData;
 
                db.Pictures.Attach(picture);
                db.Entry(picture).State = EntityState.Modified;
                
                db.SaveChanges();
                return RedirectToAction("Index");
            }
 
            return View(picture);
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 public class Picture
    {
        [Key]
        public int SitenewsId { get; set; }
        public string NameMan { get; set; }
 
        [DataType(DataType.MultilineText)]
        public string Message { get; set; }
        public DateTime? DateAdded { get; set; }
        public string Name { get; set; } 
        public byte[] Image { get; set; }
        public bool Checkbox1 { get; set; }
        public bool Checkbox2 { get; set; }
        public bool Checkbox3 { get; set; }
    }
C#
1
 @using (Html.BeginForm("Edit", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("dasdasdasdasdasdas")
        {
        }
        public DbSet<Picture> Pictures { get; set; }
        public DbSet<Itnews> Itnewses { get; set; }
        public DbSet<WorldNews> WorldNewses { get; set; }
        public DbSet<Contact> Contacts { get; set; }
        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }

та что меняется
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 public class WorldNews
    {
        [Key]
        public int WorldId { get; set; }
        public string NameMan { get; set; }
 
        [DataType(DataType.MultilineText)]
        public string Message { get; set; }
        public DateTime? DateAdded { get; set; }
        public string Name { get; set; }
        public byte[] Image { get; set; }
        public bool Checkbox1 { get; set; }
        public bool Checkbox2 { get; set; }
        public bool Checkbox3 { get; set; }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 [Authorize(Roles = "admin")]
        [HttpGet]
        public ActionResult EditWorld(int Id)
        {
 
 
            var world = db.WorldNewses.Find(Id);
 
            return View(world);
        }
        [Authorize(Roles = "admin")]
        [HttpPost]
        [ValidateAntiForgeryToken]
        [ValidateInput(false)]
        public ActionResult EditWorld([Bind(Include = "WorldId,NameMan,Message,DateAdded,Name,Image,Checkbox1,Checkbox2,Checkbox3")] WorldNews world, HttpPostedFileBase uploadImage)
        {
            if (ModelState.IsValid && uploadImage != null)
            {
                byte[] imageData = null;
 
                using (var binaryReader = new BinaryReader(uploadImage.InputStream))
                {
                    imageData = binaryReader.ReadBytes(uploadImage.ContentLength);
                }
 
                world.Image = imageData;
                db.WorldNewses.Attach(world);
                db.Entry(world).State = EntityState.Modified;
 
                db.SaveChanges();
                return RedirectToAction("Index");
            }
 
            return View(world);
        }

ошибка выходит в строке
C#
1
 db.Pictures.Attach(picture);
а когда удаляю эту строку то в
C#
1
 db.Entry(picture).State = EntityState.Modified;
Добавлено через 2 минуты
public ActionResult Edit и public ActionResult EditWorld идентичны атрибуты разные и всё
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,946
09.01.2017, 15:08
MadEagle, тогда загрузи сущность по полученному ID, обнови её свойства и запиши назад в БД.
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 49
09.01.2017, 15:56  [ТС]
, Usaga, по-моему я так и делаю ? Нет?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Authorize(Roles = "admin")]
        [HttpGet]
        public ActionResult Edit(int Id)
        {
 
 
            var picture = db.Pictures.Find(Id);
 
            return View(picture);
        }
        [Authorize(Roles = "admin")]
        [HttpPost]
        [ValidateAntiForgeryToken]
        [ValidateInput(false)]
        public ActionResult Edit([Bind(Include = "SitenewsId,NameMan,Message,DateAdded,Name,Image,Checkbox1,Checkbox2,Checkbox3")] Picture picture, HttpPostedFileBase uploadImage)
        {
            if (ModelState.IsValid && uploadImage != null)
            {
                byte[] imageData = null;
           
                using (var binaryReader = new BinaryReader(uploadImage.InputStream))
                {
                    imageData = binaryReader.ReadBytes(uploadImage.ContentLength);
                }
                picture.DateAdded = DateTime.Now;
                picture.Image = imageData;
 
                db.Pictures.Attach(picture);
                db.Entry(picture).State = EntityState.Modified;
                
                db.SaveChanges();
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,946
09.01.2017, 17:25
MadEagle, нет, не так. В методе обрабатывающем POST-запрос достань из БД нужную сущность, обнови её с помощью полученной модели представления и запиши назад в БД. Это самый верный способ, раз уж у тебя через Attach не пойми почему не работает.

Кстати, контекст у тебя где и как создаётся? Не статичный ли случаем?
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 49
09.01.2017, 17:39  [ТС]
Usaga,вот так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("dasdasdasdasdasdas")
        {
        }
        public DbSet<Picture> Pictures { get; set; }
        public DbSet<Itnews> Itnewses { get; set; }
        public DbSet<WorldNews> WorldNewses { get; set; }
        public DbSet<Contact> Contacts { get; set; }
        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,946
09.01.2017, 17:42
MadEagle, т.е. поле контроллера db содержит ссылку получаемую в консрукторе вызовом метода Create() контекста?
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 49
09.01.2017, 17:49  [ТС]
Usaga, да , но дело в том что два других метода работают нормально . а вот с этим проблема не пойму почему .их сущности одинаковы отличаются первичными ключами
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,946
09.01.2017, 17:53
MadEagle, что значит отличаются первичными ключами? Значит это разные сущности. Что-то твои ответы ясности не прибавляют.
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 49
09.01.2017, 17:59  [ТС]
Usaga,
Первый
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Picture
    {
        [Key]
        public int SitenewsId { get; set; }
        public string NameMan { get; set; }
 
        [DataType(DataType.MultilineText)]
        public string Message { get; set; }
        public DateTime? DateAdded { get; set; }
        public string Name { get; set; } 
        public byte[] Image { get; set; }
        public bool Checkbox1 { get; set; }
        public bool Checkbox2 { get; set; }
        public bool Checkbox3 { get; set; }
    }
Второй
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class WorldNews
    {
        [Key]
        public int WorldId { get; set; }
        public string NameMan { get; set; }
 
        [DataType(DataType.MultilineText)]
        public string Message { get; set; }
        public DateTime? DateAdded { get; set; }
        public string Name { get; set; } 
        public byte[] Image { get; set; }
        public bool Checkbox1 { get; set; }
        public bool Checkbox2 { get; set; }
        public bool Checkbox3 { get; set; }
    }
Третий
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Itnews
    {
        [Key]
        public int ItId { get; set; }
        public string NameMan { get; set; }
 
        [DataType(DataType.MultilineText)]
        public string Message { get; set; }
        public DateTime? DateAdded { get; set; }
        public string Name { get; set; } 
        public byte[] Image { get; set; }
        public bool Checkbox1 { get; set; }
        public bool Checkbox2 { get; set; }
        public bool Checkbox3 { get; set; }
    }
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,946
09.01.2017, 18:02
MadEagle, и какая ошибка возникает в данном случае?
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 49
09.01.2017, 18:11  [ТС]
Usaga
Ошибка только с первой сущностью когда доходит до attach() выводит ошибку :

Кликните здесь для просмотра всего текста


Дополнительные сведения: Не удалось присоединить сущность типа "WebApplication6.Models.Picture", поскольку другая сущность этого же типа уже имеет такое же значение первичного ключа. Такое возможно при использовании метода "Attach" или задании сущности состояния "Unchanged" или "Modified", если какие-либо сущности в графе имеют конфликтующие значения ключей. Такое возможно из-за того, что некоторые сущности являются новыми и пока еще не получили значения ключей, сформированные базой данных. В этом случае используйте метод "Add" или состояние сущности "Added" для отслеживания графа, а затем задайте сущностям, которые не являются новыми, состояние "Unchanged" или "Modified".

и без attach()'а такая же ошибка
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,946
09.01.2017, 18:20
MadEagle, у меня подозрение, что это просиходит потому, что у тебя контекст на все запросы один и он "помнит" сущность полученную через Find(). Как инициализируется контекст в контроллере?
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 49
09.01.2017, 18:41  [ТС]
Usaga,
В контроллере
C#
1
ApplicationDbContext db = new ApplicationDbContext()
И ловлю в каждом теле метода
C#
1
2
3
db.Pictures.Find(Id);
db.Itnewses.Find(Id);
db.WorldNewses.Find(Id);
0
180 / 58 / 7
Регистрация: 28.08.2012
Сообщений: 363
09.01.2017, 20:59
MadEagle, не мучайтесь, а просто в контроллере получайте по id старую сущность, присваивайте ей новые значения и сохраняйте изменения
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 49
09.01.2017, 23:05  [ТС]
quizzer, дело в том что она не обновлятется (не сохраняется ) выдаёт исключение
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,946
10.01.2017, 06:54
Лучший ответ Сообщение было отмечено MadEagle как решение

Решение

Цитата Сообщение от MadEagle Посмотреть сообщение
дело в том что она не обновлятется (не сохраняется ) выдаёт исключение
В четвёртый раз повторяю: в одном методе действия сначала загрузи из БД сущность, потом обнови её данными из модели представления (полученной от представления) и сохрани (без модификации состояния). Все обращения к контексту проводи с использованием оператора using.

Вариант №1 (нежелательный): модель представления содержит все свойства сущности:

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[Authorize(Roles = "admin")]
[HttpPost]
[ValidateAntiForgeryToken]
[ValidateInput(false)]
public ActionResult Edit(Picture picture, HttpPostedFileBase uploadImage)
{
    if (ModelState.IsValid && uploadImage != null)
    {
        byte[] imageData = null;
 
        using (var binaryReader = new BinaryReader(uploadImage.InputStream))
        {
            imageData = binaryReader.ReadBytes(uploadImage.ContentLength);
        }
        picture.DateAdded = DateTime.Now;
        picture.Image = imageData;
 
        using(var db = new ApplicationDbContext()) {
         db.Pictures.Attach(picture);
         db.Entry(picture).State = EntityState.Modified;
        
         db.SaveChanges();
        }
    }
}



Вариант №2: модель представления содержит только ID и свойства, которые нужно обновить

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[Authorize(Roles = "admin")]
[HttpPost]
[ValidateAntiForgeryToken]
[ValidateInput(false)]
public ActionResult Edit(Picture picture, HttpPostedFileBase uploadImage)
{
    if (ModelState.IsValid && uploadImage != null)
    {
        byte[] imageData = null;
 
        using (var binaryReader = new BinaryReader(uploadImage.InputStream))
        {
            imageData = binaryReader.ReadBytes(uploadImage.ContentLength);
        }
        picture.DateAdded = DateTime.Now;
        picture.Image = imageData;
 
        using(var db = new ApplicationDbContext()) {
         var pic = db.Pictures.Find(picture.SitenewsId);
         if (pic != null) {
             pic.DataAdded = picture.DataAdded;
             pic.Image = picture.Image;
             // .. и так все свойства, которые нужно обновить
             db.SaveChanges();
         }
        }
    }
}


Хочу заметить, что нет никакой необходимости использовать сущность в роли модели представления. Если сущность полностью подходит на эту роль, то хорошо. Но если в представление нужно отправить только часть данных из сущности, или в видоизменённом виде, то можно (и нужно) завести отдельный класс для этой цели, в который (и из которого) переносить данные из сущности (и обратно).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.01.2017, 06:54
Помогаю со студенческими работами здесь

Выборка из таблицы со вставками фото при изменении данных ячейки
Добрый вечер. Такая затея: 1. Есть таблица в MySQL. ID MALE AGE 0 --- START--- 0 лет 1 --- BOY --- 10 лет 2...

При изменении в БД срабатывает исключение
Вот код, сохранение в БД //Метод изменение данных пользователь public void UpdateUser(DataSet dataset) { ...

Вылетает исключение при изменении видимости формы
проблема с выводом 3 формы (Проект Project1 вызвал класс исключения 'External: SIGSEGV'. в файле '.\include\customform.inc' на строке 2212,...

Чудесное исключение при изменении названия кнопки
Доброго времени суток! Есть datagridview, поле ввода и кнопка для поиска Меняю название кнопки (свойство text), при запуске возникает...

InvalidOperationException при редактировании дочерней таблицы
Всем доброго времени суток! Есть база Access подключенная к проекту через DataSet. В DataGrid выводиться главная таблица и рядом во второй...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru