Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL / 20 сообщений из 20, страница 1 из 1
01.08.2013, 13:24
    #38351542
Gigant007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
Я только начинаю изучать 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
01.08.2013, 13:31
    #38351562
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
а причем тут Asp.Net?
имхо Вам в форум по EF надо

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

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

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

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

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

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


на что-то типа:
Код: c#
1.
Db.DeleteObject(forDeleteOLine);
...
Рейтинг: 0 / 0
01.08.2013, 16:49
    #38351898
Gigant007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
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
01.08.2013, 16:49
    #38351901
beowulf-da
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
Gigant007,

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

Это я знаю, просто говорю же придерживался концепции работы с конкретной сущностью, а не с контекстом. Но вопрос в другом почему добавление данных через сущность получается реализовать, а удаление нет?
...
Рейтинг: 0 / 0
01.08.2013, 17:01
    #38351924
beowulf-da
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
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
01.08.2013, 17:10
    #38351936
Gigant007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при удалении и добавлении записи из сущности EF CodeFirst в MS SQL
beowulf-da,

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

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


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