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

Свойство является частью данных ключа объекта, поэтому его нельзя изменить

21.08.2012, 16:26. Показов 7307. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сделал простую таблицу в БД без каких-либо ключей.

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE contracts(
RTS_id INT NOT NULL, --id
employee VARCHAR(100) NOT NULL, --ответственный сотрудник
document_id VARCHAR(12) NOT NULL, --номер документа
document_date smalldatetime NOT NULL, --дата документа
form VARCHAR(4) NOT NULL, --организационно правовая форма 
cosignatory VARCHAR(100) NOT NULL, --наименование контрагента
currency VARCHAR(3) NOT NULL, --валюта
doc_subject VARCHAR(100) NOT NULL, --предмет договора
amount INT NOT NULL, --сумма
stat VARCHAR(50) NOT NULL, --статус
extension bit NOT NULL -- возможность продления
)
Создал проект, подключил БД, хочу реализовать просты кнопки Редактировать | Подробнее | Удалить,
сделал AdminController

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
    public class AdminController : Controller
    {
        private RTSEntities db = new RTSEntities();
        //
        // GET: /Admin/
 
        public ActionResult Index()
        {
            var t = (from contract in db.contracts select contract).ToList();
            return View(t);
        }
 
        //
        // GET: /Admin/Details/5
 
        public ActionResult Details(int id)
        {
            var tDetails = (from contract in db.contracts where contract.RTS_id == id select contract).First();
            return View(tDetails);
        }
 
        //
        // GET: /Admin/Create
 
        public ActionResult Create()
        {
            contract contract = new contract();
            return View(contract);
        } 
 
        //
        // POST: /Admin/Create
 
        [HttpPost]
        public ActionResult Create(contract contract)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    db.AddTocontracts(contract);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
            }
            catch(Exception ex)
            {
                ModelState.AddModelError(string.Empty, ex);
            }
            return View(contract);
        }
        
        //
        // GET: /Admin/Edit/5
 
        public ActionResult Edit(int id)
        {
            var tEdit = (from contract in db.contracts where contract.RTS_id == id select contract).First();
            return View(tEdit);
        }
 
        //
        // POST: /Admin/Edit/5
 
        [HttpPost]
        public ActionResult Edit(int id, FormCollection collection)
        {
            var tEdit = (from contract in db.contracts where contract.RTS_id == id select contract).First();
 
            try
            {
                UpdateModel(tEdit);
                db.SaveChanges();
 
                return RedirectToAction("Index");
            }
            catch
            {
                return View(tEdit);
            }
        }
 
        //
        // GET: /Admin/Delete/5
 
        public ActionResult Delete(int id)
        {
            var tDelete = (from contract in db.contracts where contract.RTS_id == id select contract).First();
            return View(tDelete);
        }
 
        //
        // POST: /Admin/Delete/5
 
        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            var tDelete = (from contract in db.contracts where contract.RTS_id == id select contract).First();
            try
            {
                db.DeleteObject(tDelete);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            catch
            {
                return View(tDelete);
            }
        }
    }
}
Запускаю веб приложение, кнопка Подробнее работает нормально, но при Редактировании записи вылезает ошибка:
"Свойство является частью данных ключа объекта, поэтому его нельзя изменить."
о каком ключе идет речь ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.08.2012, 16:26
Ответы с готовыми решениями:

Файл поврежден, поэтому его нельзя открыть
вылезает ошибка при открытие в ворде 2007. что делать то???? файл поврежден поэтому его нельзя открыть и ещё проблема! не...

Не открывается файл Документ Office Open XML (docx) - файл поврежден, поэтому его нельзя открыть
Посмотрите, пожалуйста кто может! очень важно:cry: документ , который не отрывается. помогите возобновить...плиз

Изменить свойство и содержимое объекта
Создать HTML-файл версии 5, содержащий javascript. Получить доступ к элементу объекта document по его ID и изменить свойства элемента и его...

10
 Аватар для y-fox
519 / 511 / 68
Регистрация: 19.09.2011
Сообщений: 826
21.08.2012, 20:33
Если EF не задан ключ явно, он ищет ключи по такому принципу, сначала ищет поле с именем "id" в разных вариациях, если не находи, ищет поля, заканчивающиеся на "id", если находит считает их ключом, если и после этого не найдет, выпадет исключение, что у таблицы нет ключа.

В Вашем случае, он нашел 2 таких поля: RTS_id и document_id, и определил их как составной ключ.

Для того, чтобы нормально работало, задайте основной ключ явно (допишите нужному полю атрибут [Key]).
1
0 / 0 / 0
Регистрация: 28.03.2012
Сообщений: 25
21.08.2012, 22:33  [ТС]
Все переделал, теперь при любом клике кроме Create вылезает ошибка

Ошибка сервера в приложении '/'.

Элемент модели, переданный в словарь, имеет тип "System.Collections.Generic.List`1[MvcApplication1.Models.contracts]", но для этого словаря требуется элемент модели типа "MvcApplication1.Models.contracts".

Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода.

Сведения об исключении: System.InvalidOperationException: Элемент модели, переданный в словарь, имеет тип "System.Collections.Generic.List`1[MvcApplication1.Models.contracts]", но для этого словаря требуется элемент модели типа "MvcApplication1.Models.contracts".
0
 Аватар для y-fox
519 / 511 / 68
Регистрация: 19.09.2011
Сообщений: 826
21.08.2012, 22:44
Покажите, что действии и что во view'е для этого действия.
Судя по ошибке, вы передаете в типизированный view(с типом MvcApplication1.Models.contracts), объект типа List<MvcApplication1.Models.contracts>
0
0 / 0 / 0
Регистрация: 28.03.2012
Сообщений: 25
21.08.2012, 22:58  [ТС]
Вот aspx файл

HTML5
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
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/MainPage.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.contracts>" %>
 
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Delete
</asp:Content>
 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
 
    <h2>Удаление записи</h2>
 
    <h3>Вы уверены, что хотите удалить эту запись ?</h3>
    <fieldset>
        
        <div class="display-label">doc_id</div>
        <div class="display-field"><%: Model.doc_id %></div>
        
        <div class="display-label">desc</div>
        <div class="display-field"><%: Model.desc %></div>
        
        <div class="display-label">doc_data</div>
        <div class="display-field"><%: String.Format("{0:g}", Model.doc_data) %></div>
        
        <div class="display-label">sum</div>
        <div class="display-field"><%: Model.sum %></div>
        
        <div class="display-label">srok</div>
        <div class="display-field"><%: String.Format("{0:g}", Model.srok) %></div>
        
        <div class="display-label">subject</div>
        <div class="display-field"><%: Model.subject %></div>
        
        <div class="display-label">agent</div>
        <div class="display-field"><%: Model.agent %></div>
        
        <div class="display-label">stat</div>
        <div class="display-field"><%: Model.stat %></div>
        
        <div class="display-label">employee</div>
        <div class="display-field"><%: Model.employee %></div>
        
        <div class="display-label">OPF</div>
        <div class="display-field"><%: Model.OPF %></div>
        
        <div class="display-label">moneytype</div>
        <div class="display-field"><%: Model.moneytype %></div>
        
        <div class="display-label">extension</div>
        <div class="display-field"><%: Model.extension %></div>
        
    </fieldset>
    <% using (Html.BeginForm()) { %>
        <p>
            <input type="submit" value="Delete" /> |
            <%: Html.ActionLink("Назад", "Index") %>
        </p>
    <% } %>
 
</asp:Content>
Вот контроллер

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcApplication1.Models;
 
namespace MvcApplication1.Controllers
{
    public class AdminController : Controller
    {
        private ContractsEntities db = new ContractsEntities();
 
        public ActionResult Index()
        {
            var contracts = (from contract in db.contracts select contract).ToList();
            return View(contracts);
        }
 
 
        public ActionResult Details(int id)
        {
            var contractsDetails = (from contract in db.contracts
                                    where contract.RTS_id == id
                                    select contract).ToList();
            return View(contractsDetails);
        }
 
        //
        // GET: /Admin/Create
 
        public ActionResult Create()
        {
            contracts contract = new contracts();
            return View(contract);
        } 
 
        //
        // POST: /Admin/Create
 
        [HttpPost]
        public ActionResult Create(contracts contract)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    db.AddTocontracts(contract);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }            
            }
            catch(Exception ex)
            {
                ModelState.AddModelError(string.Empty, ex);
            }
            return View(contract);
 
        }
        
 
        public ActionResult Edit(int id)
        {
            var contractsEdit = (from contract in db.contracts
                                    where contract.RTS_id == id
                                    select contract).ToList();
            return View(contractsEdit);
        }
 
        //
        // POST: /Admin/Edit/5
 
        [HttpPost]
        public ActionResult Edit(int id, FormCollection collection)
        {
            var contractsEdit = (from contract in db.contracts
                                 where contract.RTS_id == id
                                 select contract).ToList();
            try
            {
                UpdateModel(contractsEdit);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            catch
            {
                return View(contractsEdit);
            }
        }
 
        //
        // GET: /Admin/Delete/5
 
        public ActionResult Delete(int id)
        {
            var contractsDelete = (from contract in db.contracts
                                 where contract.RTS_id == id
                                 select contract).ToList();
            return View(contractsDelete);
        }
 
        //
        // POST: /Admin/Delete/5
 
        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            var contractsDelete = (from contract in db.contracts
                                   where contract.RTS_id == id
                                   select contract).ToList();
            try
            {
                db.DeleteObject(contractsDelete);
                db.SaveChanges();
 
                return RedirectToAction("Index");
            }
            catch
            {
                return View(contractsDelete);
            }
        }
    }
}
Думаю, модель не имеет смысл скидывать, она автоматически создалась из БД.
0
 Аватар для y-fox
519 / 511 / 68
Регистрация: 19.09.2011
Сообщений: 826
21.08.2012, 23:07
поменяй
C#
1
2
3
4
5
6
7
public ActionResult Delete(int id)
{
       var contractsDelete = (from contract in db.contracts
                           where contract.RTS_id == id
                           select contract).ToList();
      return View(contractsDelete);
}
на
C#
1
2
3
4
public ActionResult Delete(int id)
{
   return View(db.contracts.FirstOrDefault(c=>c.RTS_id==id));
}
или
XML
1
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/MainPage.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.contracts>" %>
на
XML
1
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/MainPage.Master" Inherits="System.Web.Mvc.ViewPage<System.Collections.Generic.List<MvcApplication1.Models.contracts>>" %>
Одно из двух, судя по всему, тебе нужен первый вариант.
1
0 / 0 / 0
Регистрация: 28.03.2012
Сообщений: 25
21.08.2012, 23:22  [ТС]
А что делать, когда использую [HttpPost] ?
0
 Аватар для y-fox
519 / 511 / 68
Регистрация: 19.09.2011
Сообщений: 826
22.08.2012, 08:36
Что-то вроде этого
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[HttpPost]
        public ActionResult Delete(int id)
        {
            try
            {
                db.DeleteObject(db.contracts.First(c=>c.RTS_id==id));
                db.SaveChanges();
 
                return RedirectToAction("Index");
            }
            catch
            {
                return View(contractsDelete);
            }
        }
1
0 / 0 / 0
Регистрация: 28.03.2012
Сообщений: 25
22.08.2012, 10:10  [ТС]
Огромное спасибо, вот так вроде все работает.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            var contractsDelete = (from contract in db.contracts
                                   where contract.RTS_id == id
                                   select contract).ToList();
            try
            {
                //db.DeleteObject(contractsDelete);
                //db.SaveChanges();
                db.DeleteObject(db.contracts.First(c => c.RTS_id == id));
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            catch
            {
                return View(contractsDelete);
            }
        }
0
 Аватар для y-fox
519 / 511 / 68
Регистрация: 19.09.2011
Сообщений: 826
22.08.2012, 10:23
1.Не вижу смысла в FormCollection collection, он нигде не используется.
тут:
Цитата Сообщение от kim-kong Посмотреть сообщение
public ActionResult Delete(int id, FormCollection collection)
2. Делать сначала выборку в коллекцию, затем чтобы удалить 1 элемент, имхо глупо, выбирайте сразу 1 элемент, если непонятно или не понравился мой вариант, можете сделать так:
C#
1
2
3
4
5
var contractsDelete = (from contract in db.contracts
                                   where contract.RTS_id == id
                                   select contract).First();//Если предполагается, 
                                 //что этого элемента может уже небыть,
                                 //используйте FirstOrDefault();
Если в коллекции после выборки может быть всего 1 элемент, то делать список из него вообще лишено смысла.
1
0 / 0 / 0
Регистрация: 28.03.2012
Сообщений: 25
22.08.2012, 13:32  [ТС]
Блин, List на First забыл переименовать, когда копипастил. Огромное тебе спасибо, впредь буду внимательнее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.08.2012, 13:32
Помогаю со студенческими работами здесь

Метод объекта как его свойство
Создается экземпляр класса, у которого есть метод hl(). Нужно, чтобы для разных экземпляров у метода был разный код. Как реализовать, чтобы...

Передать свойство объекта в свойство объекта в объекте что в массиве
var array = ; function func(a, b, c) { array = {}; array.a = {}; // вместо &quot;a&quot; - аргумент array.a.b = text3; // и здесь. } ...

Вычисляемое поле: подстановка наименования объекта вместо его ключа
Имеется база данных в которую заносится наименование документации, кол-во экземпляров поступивших на хранение. Включает следующие таблицы: ...

Как сохранить в переменную само свойство объекта, а не его значение?
var obj = {}; Object.defineProperty(obj, 'prop', { get: function(){ alert('Результат'); }, set: function(value){ ...

JS: Как заменить свойство объекта при вызове его метода?
const Some = { hello: 'hello', sayHello: function() { console.log( this.hello ); }, init: function() { self = this; ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
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