powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF DB First - как найти контекст при подключении из кода
22 сообщений из 22, страница 1 из 1
EF DB First - как найти контекст при подключении из кода
    #39539849
ValGer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
В прошлом посте
( http://www.sql.ru/forum/1274643/ef-database-first-kak-podkluchitsya-s-pomoshhu-sformirovannoy-stroki-podklucheniya )
я не без вашей помощи (спасибо!) подключил базу из сформированной в коде строки подключения.
Подключение к серверу состоялось, но где теперь все таблицы? Как их найти?
Ранее, когда строка была в App.config это делалось достаточно просто:
Код: xml
1.
2.
3.
  <connectionStrings>
       <add name="MyProductShopEntities" connectionString="metadata= ... />
  </connectionStrings>



Код: c#
1.
2.
3.
4.
5.
using (var db = new MyProductShopEntities())
{
    Customer cust = db.Customers.Where(x=>x.CustId==1).SingleOrDefaul();
    ....................................................
}



Класс DbContext на этот случай имеет среди множества конструкторов один подходящий к данному случаю:

" ... DbContext(DbConnection, DbCompiledModel, Boolean)
Создает новый экземпляр контекста с использованием существующего соединения с базой данных и инициализирует его из заданной модели. "

Вроде бы то, что надо (DbConnection уже имеется), но что такое DbCompiledModel не понимаю! Где взять или как сформировать не знаю.

Выкрутиться можно:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
    public class MyProductShopModel : DbContext
    {
        public MyProductShopModel(string _connString)
            :base(_connString)
        {}
        public DbSet<Customer> Customers { get; set; }
        ...........................................................................
    }



Работает.

Но, если в базе полсотни и более таблиц, то выписывать этот класс весьма тоскливо.
Как быть?
С уважением ВВГ
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39539855
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValGer,
Что сказал Гугл на фразу Hello World EF?
Или Demo EF?
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39539856
ValGer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ValGer,
Что сказал Гугл на фразу Hello World EF?
Или Demo EF?

Не понял, что вы имеете в виду.
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39539865
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValGer,
У вас ошибка или необычный проект?
Или это ваш первый проект?
Я новую технологию изучаю делая Hello World.
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39540295
погроммист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValGer,

покажи свой класс MyProductShopEntities
он же наследует от System.Data.Entity.DbContext ?
тогда можешь сделать еще один конструктор и вызывать его со своим connString
Код: c#
1.
public MyProductShopEntities(string connString) : base(connString) {}


и еще бросилось в глаза
Код: c#
1.
Customer cust = db.Customers.Where(x=>x.CustId==1).SingleOrDefault();


если CustId это ключ в таблице Customers, то проще так:
Код: c#
1.
Customer cust = db.Customers.Find(1);
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39541466
ValGer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
погроммист,

Нашёл достаточно простое решение проблемы, о которой писал выше (как не выписывать заново все таблицы в файле контекста). Обратил внимание на то, что ранее, фигурально говоря, "пропустил мимо ушей". А именно то, что класс контекста (автогенерируемый при создании проекта) описывается как частичный (partial). Хоть и длинно, но приведу его:
Код: 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.
//------------------------------------------------------------------------------
// <auto-generated>
//     Этот код создан по шаблону.
//
//     Изменения, вносимые в этот файл вручную, могут привести к непредвиденной работе приложения.
//     Изменения, вносимые в этот файл вручную, будут перезаписаны при повторном создании кода.
// </auto-generated>
//------------------------------------------------------------------------------

namespace ConsoleApplication4
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    
    public partial class MyProductShopEntities : DbContext
    {
        public MyProductShopEntities()
            : base("name=MyProductShopEntities")
        {
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
    
        public virtual DbSet<Customer> Customers { get; set; }
        public virtual DbSet<OrderInfo> OrderInfoes { get; set; }
        public virtual DbSet<Order> Orders { get; set; }
        public virtual DbSet<Product> Products { get; set; }
    }
}



Видно, что в конструктор класса (базовый класс) входит имя контекста ("MyProductShopEntities"), а ниже имеются все нужные сущности(таблицы). Мне и подумалось, а почему бы не соорудить вторую часть этого класса (естественно, partial) с конструктором, который принимает сгенерированную в коде строку подключения. Сказано сделано:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
..................................................................................................
            ConnStringClass connClass = new ConnStringClass("SuperAdmin", "1");
            string conString = connClass.CreateConnection();
            using (var db = new MyProductShopEntities(conString))
            {
                Customer cust = db.Customers.Where(x => x.CustomerId == 1).SingleOrDefault();
            }
..................................................................................................
using System.Data.Entity;

namespace ConsoleApplication4
{
    public partial class MyProductShopEntities  : DbContext
    {
        public MyProductShopEntities(string _conString)
            :base(_conString)
        {
        }

    }
}



И voila! Всё работает - и выписывать сущности не нужно, и контекст появился.
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39541524
погроммист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это как раз то, что я тебе посоветовал))
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39541531
погроммист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
погроммист,

чтобы не создавать второй класс, можно было дописать в Blah.Context.tt
генерацию твоего конструктора
Код: c#
1.
2.
public <#=code.Escape(container)#>(string conString)
        : base(conString)    {}


и он бы появился в сгенерированном классе MyProductShopEntities
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39542676
ValGer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
погроммистпогроммист,

чтобы не создавать второй класс, можно было дописать в Blah.Context.tt
генерацию твоего конструктора
Код: c#
1.
2.
public <#=code.Escape(container)#>(string conString)
        : base(conString)    {}


и он бы появился в сгенерированном классе MyProductShopEntities

Оччень интересно!
А не могли бы вы по подробнее. Где об этом почитать?
Не будет ли эта добавка автоматически стираться. В контексте об этом прямо говорится.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
//------------------------------------------------------------------------------
// <auto-generated>
//     Этот код создан по шаблону.
//
//     Изменения, вносимые в этот файл вручную, могут привести к непредвиденной работе приложения.
//     Изменения, вносимые в этот файл вручную, будут перезаписаны при повторном создании кода.
// </auto-generated>
//------------------------------------------------------------------------------


С уважением ВВГ
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39542690
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValGerНо, если в базе полсотни и более таблиц, то выписывать этот класс весьма тоскливо.
Как быть?
С уважением ВВГ
А GenerateFromDb?
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39542733
погроммист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValGerНе будет ли эта добавка автоматически стираться. В контексте об этом прямо говорится.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
//------------------------------------------------------------------------------
// <auto-generated>
//     Этот код создан по шаблону.
//
//     Изменения, вносимые в этот файл вручную, могут привести к непредвиденной работе приложения.
//     Изменения, вносимые в этот файл вручную, будут перезаписаны при повторном создании кода.
// </auto-generated>
//------------------------------------------------------------------------------


С уважением ВВГ
из какого файла этот текст?
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39543410
ValGer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ValGerНо, если в базе полсотни и более таблиц, то выписывать этот класс весьма тоскливо.
Как быть?
С уважением ВВГ
А GenerateFromDb?

Уже всё сгенерировано и одним из результатов этой генерации является стандартная строка соединения в App.config со значением "persist security info=True;". А мне этого не нужно, поскольку на SQL-сервер должны заходить разные пользователи с разными ролями.
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39543413
ValGer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
погроммистValGerНе будет ли эта добавка автоматически стираться. В контексте об этом прямо говорится.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
//------------------------------------------------------------------------------
// <auto-generated>
//     Этот код создан по шаблону.
//
//     Изменения, вносимые в этот файл вручную, могут привести к непредвиденной работе приложения.
//     Изменения, вносимые в этот файл вручную, будут перезаписаны при повторном создании кода.
// </auto-generated>
//------------------------------------------------------------------------------


С уважением ВВГ
из какого файла этот текст?

Из файла *.context.cs
Мой пример см на рисунке.
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39543508
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValGer,
Мож я чего не понял, но этот парвметр меняют на нужный после разработки. В продакшене.
Поэтому не понял, что ты мучаешься неделю. Наверно не тем путём пошёл.
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39543520
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValGer,
Т.е. ещё раз резюмируй.
Тебя устраивает генерация всех моделей по существующей бд.
Дальше только мелким напильником рихтуем.
Так?
Я тоже ленивый программист, и тоже люблю мало кода руками писать.))
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39544171
ValGer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ValGer,
Т.е. ещё раз резюмируй.
Тебя устраивает генерация всех моделей по существующей бд.
Дальше только мелким напильником рихтуем.
Так?
Я тоже ленивый программист, и тоже люблю мало кода руками писать.))

Ну, примерно так.
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39544204
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValGer,
Ок.
А то у меня скоро проект именно DB главная и первичная (first).
И не вижу пока твоих сложностей.
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39544566
погроммист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValGerпогроммистпропущено...

из какого файла этот текст?

Из файла *.context.cs
Мой пример см на рисунке.
читай внимательно
я предлагал редактировать не *.cs, a MyProductShopModel.Context .tt
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39544568
погроммист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ValGer,
Мож я чего не понял, но этот парвметр меняют на нужный после разработки. В продакшене.
Поэтому не понял, что ты мучаешься неделю. Наверно не тем путём пошёл.
я уже тоже запутался, что хочет ТС
но у него вроде там под каждого пользователя приложения свой ConnString задуман
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39544675
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
погроммист,
Вроде бы это изврат в теме про ОРМ.
В орм обезличенный анонимус))).
Я тоже не в курсе что там у него.
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39544698
погроммист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123погроммист,
Вроде бы это изврат в теме про ОРМ.
В орм обезличенный анонимус))).
Я тоже не в курсе что там у него.
я не понял, о чем ты
а я про вот эту ветку http://www.sql.ru/forum/1274643/ef-database-first-kak-podkluchitsya-s-pomoshhu-sformirovannoy-stroki-podklucheniya
...
Рейтинг: 0 / 0
EF DB First - как найти контекст при подключении из кода
    #39544721
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
погроммист,
Тут у меня разрыв шаблона.
))
По хиберу знаю, что он ходит под единой строкой коннекта, а внешняя либа уже делает права для юзверя.
Как это в EF пока не знаю.
Ладно, пусть автор проясняет. Если захочет.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF DB First - как найти контекст при подключении из кода
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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