Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
ВладимирС Сообщений: 1693 Дата регистрации: 03.11.2005 |
Хорошо, когда Entities - простой...
Тут кинули на проект, надо типа помочь. Но тот кто писал, уже уволился... Вот скрипт запроса:
Конечно, может (скорее всего), я плохо разбираюсь в Linq... По мне, лучше бы запрос написали. Как связи идут - непонятно. Исправлено 1 раз(а). Последнее : ВладимирС, 08.08.18 14:27 |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
AlexSSS Автор Сообщений: 6113 Откуда: Tallinn, Estonia Дата регистрации: 19.09.2005 |
EF
что-то я торможу ;(
BindingSource привязан к DataGridView, в нем данные корректно отражаются пока все нормально в базе делаю изменение данных 1. как обновить в программе всю таблицу Manager и как обновить одну конкретную запись, напр, ID = 1? Entity.Manager.Load() ничего визуально не обновляет, хотя запрос на сервер идет (вижу через профайлер) 2. как в VisualStudio в Watch посмотреть, какие реально записи и значения содержаться в Entity.Manager.Local? Исправлено 3 раз(а). Последнее : AlexSSS, 08.08.18 15:57 |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
ВладимирС
Красиво... хоть и непонятно))) Но зная логику и структуру объектов, наверное разобраться можно) Ну и... в EF легко пишутся запросы. AlexSSS Немного не понял кода... Если Entity - это контекст данных, то что такое Entity.Manager.Load() ? 1. Для обновления добавления, создаешь объект Manager либо с данными ID=1 Либо новый. Заполняешь-меняешь нужные поля. далее Entity.Entry(Manager).State = EntityState.Modified; --показываешь, что данные изменились Entity.SaveChanges; -сохраняешь все измененные данные контекста 2. Становишься на переменную, там стрелочка на раскрытие, жмешь, все записи видны, можно изучать) Можа коряво описал))) И твой код не понял((( там... после инициализации формы, видимо ручками надо все назначить. Вот это не понял Entity.Manager.Load(); и = Entity.Manager.Local.ToBindingList(); может специфичные для винформ. Я с ними совсем мало знаком. ------------------ Исправлено 1 раз(а). Последнее : Аспид, 08.08.18 18:10 |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
AlexSSS Автор Сообщений: 6113 Откуда: Tallinn, Estonia Дата регистрации: 19.09.2005 |
свой вариант я нашел из примера Микрософта.
msdn.microsoft.com в твоем примере объект Manager - это одна запись или, условно говоря, таблица? я видел похожие примеры и мне показалось, что это только одна запись. Исправлено 1 раз(а). Последнее : AlexSSS, 08.08.18 18:19 |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Глянь ссылку
www.codeproject.com может пригодится. Хотя, мне кажется, и так все должно. Ща попробую (если дадут :gigi простой тестик накидать) ------------------ |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
AlexSSS Автор Сообщений: 6113 Откуда: Tallinn, Estonia Дата регистрации: 19.09.2005 |
мне же нужно получить ссылку на таблицу, которую можно засунуть в грид |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Смотри, объект Manager - это всегда эквивалент 1й записи.
Набор записей, это например List<t> В твоем случае List<Manager> Потому, я бы получил примерно так
Entity.SaveChanges; - сохраняет вообще, все что описано в контексте, и требует сохранения (EF умный) Ща почитаю твою ссылку ------------------ |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
db.Persons - это ссылка на таблицу
Это все описано в контексте Person person= db.Persons.Find(id); Это конкретная запись с id=id ------------------ |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
AlexSSS Автор Сообщений: 6113 Откуда: Tallinn, Estonia Дата регистрации: 19.09.2005 |
умность при сохранении я уже оценил ;)
ps. спасибо, что несмотря на сопротивление, наставил меня на путь истинный. Уже сейчас вижу, что даже на этом проекте с EF заморочек будет меньше |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
AlexSSS Автор Сообщений: 6113 Откуда: Tallinn, Estonia Дата регистрации: 19.09.2005 |
правильно я понял, что возможности добавить в Code First новых таблиц c помощью визарда нет
и надо 1. либо самому писать код 2. либо заново генерить весь код визардом 3. либо генерить недостающий код визардом и вручную его вставлять в имеющийся код Исправлено 1 раз(а). Последнее : AlexSSS, 08.08.18 18:37 |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Между перепиской, создал новый проект винформ.
Далее, добавить класс Выбираю Модель ADO.NET EDM В ней Конструктор EF из БД Далее EF 6 Выбрал для проверки 1 табличку (adres) Сразу получил класс контекст, и класс adres В контектсе
Далее на форму затащил грид и в конструкторе формы
Все сразу заработало. Тебе ясно, надо со свое)) Сбежало, не успел дописать. Натрави на свою БД, выбери нужные табл. с 1й эксперимент, ровно 5 мин. ------------------ Исправлено 1 раз(а). Последнее : Аспид, 08.08.18 18:42 |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
AlexSSS Автор Сообщений: 6113 Откуда: Tallinn, Estonia Дата регистрации: 19.09.2005 |
>с 1й эксперимент, ровно 5 мин.
ну так это если знать, куда копать! |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Code First - это подход. То как я описал получение данных, вполне, далее ни чем не отличается, а с чистым Code First, при уже имеющейся БД, еще и проблемы вылазят))) Я как правило, после создания, правлю модель. Убираю не нужные поля. А иногда, новый класс, легче руками добавить, чем генерить. Но начало, неизменно из БД автоматом. У меня не случалось, что бы сначала код... Старый уже))) Привычка великое дело, мне легче от БД танцевать. ------------------ |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Так я ж прямо записал все свои действия))) Попробуй. Все должно покатить))) ------------------ |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
AlexSSS Автор Сообщений: 6113 Откуда: Tallinn, Estonia Дата регистрации: 19.09.2005 |
повторить действия - это я могу ;)
|
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Глянул статейку. Но так и не понял, что это за функции((( Не охота разбираться) Т.к. то что накидал, работает, и по мне так проще))) (я там все понимаю))) ------------------ |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Прочитал
www.codeproject.com Раз пишут, значит это зачем то надо))) Главное все понятно. Видимо, это для тех кто привык к стандартной работе, с датасетами и биндами, в винформ. Наверное полезная штука 2014 год. Под ef6 заточен. А я лично ef 7 и не щупал ------------------ |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
AlexSSS Автор Сообщений: 6113 Откуда: Tallinn, Estonia Дата регистрации: 19.09.2005 |
1.
т.е. db.adres.ToList() - это заливает в список все записи. как обновить в этом списке, напр, запись с ID = 1? List<adres> adr = db.adres.where(p=> p.ID ==1).ToList() - это очистит список и поместит в него одну запись, где ID ==1 мне же надо, чтобы список не очищался, а из всех имеющихся записей ОБНОВИЛАСЬ с сервера только одна 2. Есть ли возможность какого-то .RELOAD списка c учетом TIMESTAMP? Исправлено 3 раз(а). Последнее : AlexSSS, 09.08.18 10:45 |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
если честно, само желание не понятно, ну да лана)
List<adres> adr - это коллекция объектов адрес т.е. ты можешь получить объект
2. Не понял. TIMESTAMP - он на сервере изменился. Ты хочешь, только те получить, изменить которые поменялись? Допускаю, что кто то такое делал))) Мне же, не ясен смысл. Это уже БЛ. Коли я получил какие то данные, и могу ими обойтись - обхожусь) если надо всегда делать что то актуальное (например посчитать стоимость, а цена могла сек. назад поменяться, потому как скидку внесли), делаю это прямо на сервере. Но возможно я не о том... ------------------ |
Re: c# winforms унифицировать обращение к TableAdapter | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Лучше день потерять, а потом за 5 минут долететь Использовать датасеты и адаптеры при том что собственно изменение БД делается прямыми запросами - весьма большое извращение. Такого же рода, как использовать фоксовые курсор-адаптеры но все изменения данных помимо изменения в самом курсоре пропихивать через sqlexec на сервер. А потом какими-то манипуляциями "перезапрашивать" их (напрямую не выйдет, т.к. будут мешать те самые "несохранённые" изменения - ну для фокса они несохранённые, он то не в курсе про "прямые SQLEXEC"). "Устаревший но не запрещённый" это использовать Dataset и адаптеры правильно В соответствии с задумками авторов этих компонент. Нормально. из ДБ* Желательно знать про коннекшн, не повредит понимание комманд, датаридер. знание датасет, дататэйбл, датароу, и адапетров - абсолютно лишнее. биндингсорс вообще из другой оперы - он никак к датасетам не относится (хотя может и с ними работать). Есть разные задачи. Для типичного юзер-ввода "тормоза" несущественны - поскольку там не нужно по 100500 записей из 100500 таблиц одновременно вынимать, или строить мега-запросы где даже напрямую на SQL порой сложно "сформулировать". Там же где это важно - могу посоветовать даппер - это микро-маппер поверх того самого дбдатаридера - т.е. ты сам готовишь SQL, а он уже результат распихивает в объектную модель. Но, конечно, для манипуляции данными он не подходит - хорош "на чтение" (отчёты, к примеру). Насколько я понимаю, строка db.Entry(person).State = EntityState.Modified; лишняя, если работаем с одним и тем же объектом контекста, т.е. грубо говоря это у тебя один блок кода внутри одного using (var db = new AbzContext()). Такая конструкция нужна чтобы НЕ загружая из БД запись мог отправить туда её update. Т.е. без db.Persons.Find(...) скажем через new создать Person, ну или взять объект ранее полученный через другой объект контекста (уже закрытый). Всё же класс Person это класс DbRow, т.е. класс для "одной записи". дататэйблом можно, наверное, считать List<Person> или, с некоторыми натяжками, DbSet<Person>, IQueryable<Person> (это типа представления, но "неисполненные/незавершённые" - т.е. этакая "заготовка", куда дописывая .Where и прочие линкью методы уже получаем в итоге результат выборки). ------------------ WBR, Igor |
© 2000-2024 Fox Club  |