:: Не фоксом единым
Re: c# winforms унифицировать обращение к TableAdapter
ВладимирС

Сообщений: 1693
Дата регистрации: 03.11.2005
Хорошо, когда Entities - простой...
Тут кинули на проект, надо типа помочь. Но тот кто писал, уже уволился...
Вот скрипт запроса:
using (var c = new EOEntities())
{
var result = c.IndicatorCategorySet
.Single(p => p.Name == category)
.Indicators
.OrderBy(p => p.Position)
.Select(p => new
{
p.Id,
p.Caption,
p.ParentId,
Unit = p.Indicators.Max(q =>
string.IsNullOrWhiteSpace(q.Unit)
? q.IndicatorRawId.HasValue
? q.Indicator.Unit
: q.Combinations.Max(
r => r.IndicatorRaw.Unit)
: q.Unit),
Charts = p.Indicators
.Select(q => new
{
q.Id,
q.ChartType,
q.Type,
Show =
!q.IndicatorRawId.HasValue ||
q.Indicator.Data.Count(
r => r.Category.Type == q.Type) > 1 &&
q.Indicator.Data.Count(
r => r.Category.Year >= 2009) > 0
}).
Where(q => q.Show).
ToArray()
})
.ToList();
return result;
}
С моей точки зрения охренеть. Сижу ковыряюсь.
Конечно, может (скорее всего), я плохо разбираюсь в Linq...
По мне, лучше бы запрос написали.
Как связи идут - непонятно.



Исправлено 1 раз(а). Последнее : ВладимирС, 08.08.18 14:27
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
EF

что-то я торможу ;(
Entity = new edPortContext();
Entity.Manager.Load();
this.oBindingSource.DataSource = Entity.Manager.Local.ToBindingList();
берет данные с таблицы Manager
BindingSource привязан к DataGridView, в нем данные корректно отражаются
пока все нормально

в базе делаю изменение данных
1. как обновить в программе всю таблицу Manager и как обновить одну конкретную запись, напр, ID = 1?

Entity.Manager.Load() ничего визуально не обновляет, хотя запрос на сервер идет (вижу через профайлер)

2. как в VisualStudio в Watch посмотреть, какие реально записи и значения содержаться в Entity.Manager.Local?



Исправлено 3 раз(а). Последнее : AlexSSS, 08.08.18 15:57
Ratings: 0 negative/0 positive
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
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
свой вариант я нашел из примера Микрософта.
msdn.microsoft.com

в твоем примере объект Manager - это одна запись или, условно говоря, таблица?
я видел похожие примеры и мне показалось, что это только одна запись.



Исправлено 1 раз(а). Последнее : AlexSSS, 08.08.18 18:19
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Глянь ссылку
www.codeproject.com
может пригодится.
Хотя, мне кажется, и так все должно.
Ща попробую (если дадут :gigi простой тестик накидать)


------------------
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
Person person= db.Persons.Find(id);
person.Name= name;
...
db.Entry(person).State = EntityState.Modified;
db.SaveChanges();
в твоем примере person - это запись
мне же нужно получить ссылку на таблицу, которую можно засунуть в грид
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Смотри, объект Manager - это всегда эквивалент 1й записи.
Набор записей, это например List<t>
В твоем случае List<Manager>
Потому, я бы получил примерно так
Entity = new edPortContext(); -- это если верно угадал что это контекст, и там все описано)
List<Manager> managers = Entity.Managers.toList();
dgv.DataSource=managers; - dgv - грид

Entity.SaveChanges; - сохраняет вообще, все что описано в контексте, и требует сохранения (EF умный)

Ща почитаю твою ссылку


------------------
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
db.Persons - это ссылка на таблицу
Это все описано в контексте

Person person= db.Persons.Find(id);
Это конкретная запись с id=id


------------------
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
умность при сохранении я уже оценил ;)

ps. спасибо, что несмотря на сопротивление, наставил меня на путь истинный. Уже сейчас вижу, что даже на этом проекте с EF заморочек будет меньше
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
правильно я понял, что возможности добавить в Code First новых таблиц c помощью визарда нет
и надо
1. либо самому писать код
2. либо заново генерить весь код визардом
3. либо генерить недостающий код визардом и вручную его вставлять в имеющийся код



Исправлено 1 раз(а). Последнее : AlexSSS, 08.08.18 18:37
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Между перепиской, создал новый проект винформ.
Далее, добавить класс
Выбираю Модель ADO.NET EDM
В ней Конструктор EF из БД
Далее EF 6
Выбрал для проверки 1 табличку (adres)
Сразу получил класс контекст, и класс adres
В контектсе
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан по шаблону.
//
// Изменения, вносимые в этот файл вручную, могут привести к непредвиденной работе приложения.
// Изменения, вносимые в этот файл вручную, будут перезаписаны при повторном создании кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace WindowsFormsApp1
{
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
public partial class orgEntities : DbContext
{
public orgEntities()
: base("name=orgEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<adres> adres { get; set; }
}
}
Класс адрес
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан по шаблону.
//
// Изменения, вносимые в этот файл вручную, могут привести к непредвиденной работе приложения.
// Изменения, вносимые в этот файл вручную, будут перезаписаны при повторном создании кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace WindowsFormsApp1
{
using System;
using System.Collections.Generic;
public partial class adres
{
public int ID_ADRES { get; set; }
public Nullable<int> ID_CUSTOM { get; set; }
public string txt { get; set; }
public int rast { get; set; }
public Nullable<System.DateTime> lastdat { get; set; }
public decimal price { get; set; }
public Nullable<int> recold { get; set; }
public short ismark { get; set; }
public short flvisible { get; set; }
public Nullable<int> user_id { get; set; }
}
}

Далее на форму затащил грид
и в конструкторе формы
orgEntities db = new orgEntities();
List<adres> adr = db.adres.ToList();
this.dataGridView1.DataSource = adr;

Все сразу заработало.
Тебе ясно, надо со свое))
Сбежало, не успел дописать.

Натрави на свою БД, выбери нужные табл.
с 1й эксперимент, ровно 5 мин.


------------------




Исправлено 1 раз(а). Последнее : Аспид, 08.08.18 18:42
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
>с 1й эксперимент, ровно 5 мин.
ну так это если знать, куда копать!
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
AlexSSS
правильно я понял, что возможности добавить в Code First новых таблиц c помощью визарда нет
и надо
1. либо самому писать код
2. либо заново генерить весь код визардом
3. либо генерить недостающий код визардом и вручную его вставлять в имеющийся код
Code First - это подход.
То как я описал получение данных, вполне, далее ни чем не отличается, а с чистым Code First, при уже имеющейся БД, еще и проблемы вылазят)))
Я как правило, после создания, правлю модель. Убираю не нужные поля.
А иногда, новый класс, легче руками добавить, чем генерить.
Но начало, неизменно из БД автоматом.

У меня не случалось, что бы сначала код...
Старый уже))) Привычка великое дело, мне легче от БД танцевать.


------------------
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
AlexSSS
>
ну так это если знать, куда копать!

Так я ж прямо записал все свои действия)))
Попробуй. Все должно покатить)))


------------------
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
повторить действия - это я могу ;)
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
AlexSSS
свой вариант я нашел из примера Микрософта.
msdn.microsoft.com
Глянул статейку.
Но так и не понял, что это за функции(((
Не охота разбираться)

Т.к. то что накидал, работает, и по мне так проще)))
(я там все понимаю)))


------------------
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Прочитал
www.codeproject.com
Раз пишут, значит это зачем то надо)))
Главное все понятно.
Видимо, это для тех кто привык к стандартной работе, с датасетами и биндами, в винформ.
Наверное полезная штука
2014 год. Под ef6 заточен.
А я лично ef 7 и не щупал


------------------
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
AlexSSS
Автор

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
1.
List<adres> adr = db.adres.ToList();
как при таком подходе можно обновить только конкретные записи с базы?

т.е. 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
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
если честно, само желание не понятно, ну да лана)
List<adres> adr - это коллекция объектов адрес
т.е. ты можешь получить объект
Adres adres = db.adres.where(p=> p.ID ==1);
Далее в коллекции adr, переписать нужный объект.
2. Не понял.
TIMESTAMP - он на сервере изменился.
Ты хочешь, только те получить, изменить которые поменялись?
Допускаю, что кто то такое делал)))
Мне же, не ясен смысл.

Это уже БЛ. Коли я получил какие то данные, и могу ими обойтись - обхожусь)
если надо всегда делать что то актуальное (например посчитать стоимость, а цена могла сек. назад поменяться, потому как скидку внесли), делаю это прямо на сервере.
Но возможно я не о том...


------------------
Ratings: 0 negative/0 positive
Re: c# winforms унифицировать обращение к TableAdapter
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Аспид
Igor Korolyov
Адаптер не для того предназначен...
Мне кажется, все нормально. Посмотри 1й вопрос. Алекс решает задачу, на новом языке, понятным ему способом.
Лучше день потерять, а потом за 5 минут долететь
Использовать датасеты и адаптеры при том что собственно изменение БД делается прямыми запросами - весьма большое извращение. Такого же рода, как использовать фоксовые курсор-адаптеры но все изменения данных помимо изменения в самом курсоре пропихивать через sqlexec на сервер. А потом какими-то манипуляциями "перезапрашивать" их (напрямую не выйдет, т.к. будут мешать те самые "несохранённые" изменения - ну для фокса они несохранённые, он то не в курсе про "прямые SQLEXEC").
Аспид
И этот способ, устаревший, но не запрещенный.
"Устаревший но не запрещённый" это использовать Dataset и адаптеры правильно В соответствии с задумками авторов этих компонент.
Аспид
Более того, сразу взяться за EF, и в дальнейшем не знать о DataTable,DataSet, BindingSource... то же не очень, наверное.
Нормально. из ДБ* Желательно знать про коннекшн, не повредит понимание комманд, датаридер. знание датасет, дататэйбл, датароу, и адапетров - абсолютно лишнее.
биндингсорс вообще из другой оперы - он никак к датасетам не относится (хотя может и с ними работать).
Аспид
Какое то время, не доверял EF.
Первые эксперименты, показали его тормознутость
Есть разные задачи. Для типичного юзер-ввода "тормоза" несущественны - поскольку там не нужно по 100500 записей из 100500 таблиц одновременно вынимать, или строить мега-запросы где даже напрямую на SQL порой сложно "сформулировать".
Там же где это важно - могу посоветовать даппер - это микро-маппер поверх того самого дбдатаридера - т.е. ты сам готовишь SQL, а он уже результат распихивает в объектную модель. Но, конечно, для манипуляции данными он не подходит - хорош "на чтение" (отчёты, к примеру).
Аспид
Изменение данных.
Насколько я понимаю, строка db.Entry(person).State = EntityState.Modified; лишняя, если работаем с одним и тем же объектом контекста, т.е. грубо говоря это у тебя один блок кода внутри одного using (var db = new AbzContext()). Такая конструкция нужна чтобы НЕ загружая из БД запись мог отправить туда её update. Т.е. без db.Persons.Find(...) скажем через new создать Person, ну или взять объект ранее полученный через другой объект контекста (уже закрытый).
Аспид
class Person - суть тот же дататабле
Всё же класс Person это класс DbRow, т.е. класс для "одной записи". дататэйблом можно, наверное, считать List<Person> или, с некоторыми натяжками, DbSet<Person>, IQueryable<Person> (это типа представления, но "неисполненные/незавершённые" - т.е. этакая "заготовка", куда дописывая .Where и прочие линкью методы уже получаем в итоге результат выборки).


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 7 (Гостей: 7)

© 2000-2024 Fox Club 
Яндекс.Метрика