powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
20 сообщений из 20, страница 1 из 1
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351542
Gigant007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я только начинаю изучать ASP.NET и связанные с ним технологии, поэтому буду очень признателен за любую конструктивную критику с пояснениями.
Структура созданная при помощи EF Code First. Приведена ниже.
http://www.screencapture.ru/file/7d6c75dA
Есть предположение, что надо работать с сущностями не зависимо от контекста, т.е. я так понял, что все действия только через currentCustomer которого мы извлекаем один раз, допустим равного
Код: c#
1.
Customer currentCustomer = _db.Customers.First()


Так как доступ к базе данных надо минимизировать, то хотелось бы, что бы в начале все изменения были занесены в объект currentCustomer класса Customer или в коллекции связанные с ним Orders или OrderLines, а потом уже при выходе все сохранялось бы в БД один раз скопом, если это конечно возможно. Но столкнулся с проблемой при удалении двух и более объектов из коллекции OrderLine выдается сообщение

Операция завершилась с ошибкой. Не удалось изменить связь, поскольку один или несколько свойств внешнего ключа не допускают значения NULL. При изменении связи соответствующему свойству внешнего ключа присваивается значение NULL. Если внешний ключ не поддерживает значений NULL, должна быть определена новая связь, свойству внешнего ключа должно быть присвоено другое значение, отличное от NULL, либо необходимо удалить несвязанный объект.

Тоже сообщение выдается при выполнении следующей последовательности действий над коллекцией OrderLines удалили элемент из коллекции-> добавили элемент -> попытка сохранения...
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351562
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а причем тут Asp.Net?
имхо Вам в форум по EF надо

ЗЫ я бы сам помог, но у меня опыт только с L2S
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351563
Gigant007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Паганель,

Ок, а как нить перепубликовать в другой ветке текущий пост нельзя?
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351568
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нажмите кнопку "Сообщить модератору"
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351574
Gigant007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Паганель,

Спасибо, я уже занового перезабил. Здесь есть система поощрений каких нибудь, могу я вам "увеличить рейтинг" или что ли бо в этом духе, за то что откликнулись?)
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351587
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рейтинг? Не слыхал про такое :)
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351810
beowulf-da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gigant007,

Покажите код ваших манипуляций. Как удаляете объект из контекста? DeleteObject()?
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351852
Gigant007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
beowulf-da,

Нет я прочел, что DeleteObject() работает только через контекст, а хочу работать исключительно с сущностью. Код следующий

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public void DeleteOrderLine(int id)
        {
            foreach (Order order in CurrentCustomer.Orders)
            {
                if (order.OrderLines.Any(e => e.Id == id))
                {
                    OrderLine forDeleteOLine = order.OrderLines.FirstOrDefault(e => e.Id == id);
                    CurrentCustomer.Orders.FirstOrDefault(e => e.Id == forDeleteOLine.OrderId).OrderLines.Remove(forDeleteOLine);
                    Db.SaveChanges();
                }
            }
        }
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351873
beowulf-da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gigant007,

Remove не удаляет объект из контекста. Вам нужен как раз DeleteObject().
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351874
Gigant007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все поля являются имеют свойство nullable: false. Если сделать поле OrderId у класса OrderLine nullable: true, то функция Remove просто удаляет значение из этого свойства и запись OrderLine остается в базе, но со значением null. Подскажите пожалуйста способ удаления записей из БД которые отсутствуют в сущности. Если такое не возможно, то тогда другой вариант решения.
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351885
beowulf-da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gigant007Есть предположение, что надо работать с сущностями не зависимо от контекстаВсе сущности (те, которые должны храниться в БД) принадлежат контексту. Можно создать новую сущность отдельно, но, чтобы она сохранилась в БД, её нужно добавить в контекст.

Ваш Remove удаляет OrderLine из Order, но в контексте он остаётся с "занулённой" связью.
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351894
beowulf-da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gigant007Подскажите пожалуйста способ удаления записей из БД которые отсутствуют в сущности.
Замените
Код: c#
1.
CurrentCustomer.Orders.FirstOrDefault(e => e.Id == forDeleteOLine.OrderId).OrderLines.Remove(forDeleteOLine);


на что-то типа:
Код: c#
1.
Db.DeleteObject(forDeleteOLine);
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351898
Gigant007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
beowulf-daВсе сущности (те, которые должны храниться в БД) принадлежат контексту. Можно создать новую сущность отдельно, но, чтобы она сохранилась в БД, её нужно добавить в контекст.

Я тоже так думал, но тогда непонятно почему и как работает следующий код
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public void CreateOrderLine(OrderLine orderLine)
        {
            if (orderLine != null)
            {
                CurrentCustomer.Orders.FirstOrDefault(e => e.Id == orderLine.OrderId).OrderLines.Add(orderLine);
                Db.SaveChanges();
            }
        }


где CurrentCustomer присваивается следующим образом
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
[HttpPost]
        public ActionResult Login(string login, string password)
        {
            _currentCDetail = new CustomerDetail();
            LoginClass loginObject = new LoginClass();
            Customer customer = loginObject.Login(login, password, _currentCDetail.Db);
            if (customer != null)
            {
                _currentCDetail.CurrentCustomer = customer;
                Session["CurrentCustomer"] = _currentCDetail;
                return RedirectToAction("ListOrders", "Main");
            }
            return View();
        }
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351901
beowulf-da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gigant007,

Да и цикл тут не нужен. У вас же Id передаётся в метод. Требуемый OrderLine вы можете из контекста по Id получить, не перебирая все Order.
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351913
Gigant007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
beowulf-da,

Это я знаю, просто говорю же придерживался концепции работы с конкретной сущностью, а не с контекстом. Но вопрос в другом почему добавление данных через сущность получается реализовать, а удаление нет?
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351924
beowulf-da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gigant007Я тоже так думал, но тогда непонятно почему и как работает следующий код
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public void CreateOrderLine(OrderLine orderLine)
        {
            if (orderLine != null)
            {
                CurrentCustomer.Orders.FirstOrDefault(e => e.Id == orderLine.OrderId).OrderLines.Add(orderLine);
                Db.SaveChanges();
            }
        }

Такое добавление сущностей допускается. И ваш объект orderLine, который до добавления не принадлежал контексту, оказывается внутри и сохраняется в базу.

Gigant007как работает следующий кодМожете рефлектором посмотреть как именно)))
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351936
Gigant007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
beowulf-da,

Я понял, в любом случае необходимо работать с контекстом. Спасибо огромное!
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351938
beowulf-da
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gigant007Это я знаю, просто говорю же придерживался концепции работы с конкретной сущностью, а не с контекстом.Кстати, что это за концепция такая?

Gigant007Но вопрос в другом почему добавление данных через сущность получается реализовать, а удаление нет?EF так устроен. Ну и это логично. Когда вы добавляете свой новый объект - на него точно ссылается только 1 объект Order. А вот при удалении - на него могут ссылаться другие Order, значит просто так (через Remove) удалять его нельзя.
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38351968
Gigant007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
beowulf-daGigant007Это я знаю, просто говорю же придерживался концепции работы с конкретной сущностью, а не с контекстом.Кстати, что это за концепция такая?
Ну это даже не концепция, а скорее мое представление того, что EF должна быть максимально ориентирована на сущность, т.е. вся работа должна производиться с непосредственной сущностью, а не через контекст. И это работает, как с добавлением сущностей, так и с редактированием.
beowulf-daGigant007Но вопрос в другом почему добавление данных через сущность получается реализовать, а удаление нет?EF так устроен. Ну и это логично. Когда вы добавляете свой новый объект - на него точно ссылается только 1 объект Order. А вот при удалении - на него могут ссылаться другие Order, значит просто так (через Remove) удалять его нельзя.
Не только удаление, но и редактирование можно произвести непосредственно в сущности. А получается из того, что Вы написали на счет ордера неверно, т.к. у OrderLine есть одного поле OrderId, которое указывает какой именно Order на него ссылается.
...
Рейтинг: 0 / 0
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
    #38352509
Gigant007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати вот описание того как связывается DbContext с entity и как работает SaveChange
http://msdn.microsoft.com/en-US/data/jj592676
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]