Dbset c что это
Перейти к содержимому

Dbset c что это

  • автор:

Основы Entity Framework

Большинство операций с данными представляют собой CRUD-операции (Create, Read, Update, Delete), то есть получение данных, создание, обновление и удаление. Entity Framework позволяет легко производить данные операции.

Для примеров с операциями возьмем простенькую модель Phone:

public class Phone < public int Id < get; set; >public string Name < get; set; >public int Price < get; set; >>

И следующий класс контекста данных:

public class PhoneContext : DbContext < public PhoneContext() : base("DefaultConnection") < >public DbSet Phones < get; set; >>

Добавление

Для добавления применяется метод Add() у объекта DbSet:

using (PhoneContext db = new PhoneContext()) < Phone p1 = new Phone < Name = "Samsung Galaxy S7", Price = 20000 >; Phone p2 = new Phone < Name = "iPhone 7", Price = 28000 >; // добавление db.Phones.Add(p1); db.Phones.Add(p2); db.SaveChanges(); // сохранение изменений var phones = db.Phones.ToList(); foreach (var p in phones) Console.WriteLine(" - - ", p.Id, p.Name, p.Price); >

После добавления надо сохранить все изменения с помощью метода SaveChanges() .

1 - Samsung Galaxy S7 - 20000 1 - iPhone 7 - 28000

Редактирование

Контекст данных способен отслеживать изменения объектов, поэтому для редактирования объекта достаточно изменить его свойства и после этого вызвать метод SaveChanges() :

using (PhoneContext db = new PhoneContext()) < // получаем первый объект Phone p1 = db.Phones.FirstOrDefault(); p1.Price = 30000; db.SaveChanges(); // сохраняем изменения >

Но рассмотрим другую ситуацию:

Phone p1; using (PhoneContext db = new PhoneContext()) < p1 = db.Phones.FirstOrDefault(); >using (PhoneContext db = new PhoneContext()) < if(p1!=null) < p1.Price = 60000; db.SaveChanges(); >>

Так как объект Phone получен в одном контексте, а изменяется для другого контекста, который его не отслеживает. В итоге изменения не сохранятся. Чтобы изменения сохранились, нам явным образом надо установить для его состояния значение EntityState.Modified :

using (PhoneContext db = new PhoneContext()) < if(p1!=null) < p1.Price = 60000; db.Entry(p1).State = EntityState.Modified; db.SaveChanges(); >>

Удаление

Для удаления объекта применяется метод Remove() объекта DbSet:

using (PhoneContext db = new PhoneContext()) < Phone p1 = db.Phones.FirstOrDefault(); if(p1!=null) < db.Phones.Remove(p1); db.SaveChanges(); >>

Но как и в случае с обновлением здесь мы можем столкнуться с похожей проблемой, когда объект получаем из базы данных в пределах одного контекста, а пытаемся удалить в другом контексте. И в этом случае нам надо установить вручную у объекта состояние EntityState.Deleted :

using (PhoneContext db = new PhoneContext()) < if(p1!=null) < db.Entry(p1).State = EntityState.Deleted; db.SaveChanges(); >>

Метод Attach

Если объект получен в одном контексте, а сохраняется в другом, то мы можем устанавливать у него вручную состояния EntityState.Updated или EntityState.Deleted. Но есть еще один способ: с помощью метода Attach у объекта DbSet мы можем прикрепить объект к текущему контексту данных:

Phone p1; using (PhoneContext db = new PhoneContext()) < p1 = db.Phones.FirstOrDefault(); >// редактирование using (PhoneContext db = new PhoneContext()) < if(p1!=null) < db.Phones.Attach(p1); p1.Price = 999; db.SaveChanges(); >> // удаление using (PhoneContext db = new PhoneContext()) < if(p1!=null) < db.Phones.Attach(p1); db.Phones.Remove(p1); db.SaveChanges(); >>

Dbset c что это

Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core

Последнее обновление: 24.10.2018

Чтобы непосредственно начать работать с Entity Framework, создадим первое приложение. Для этого нам нужна будет, во-первых, среда разработки. В качестве среды разработки выберем Visual Studio 2017.

В окне создания проекта в левой части выберем секцию Visual C#->Windows Desktop и в центральной части окна в качестве типа проекта выберем Console App (.NET Framework) .

Создание проекта для Entity Framework 6

Теперь первым делом добавим новый класс, который будет описывать данные. Пусть наше приложение будет посвящено работе с пользователями. Поэтому добавим в проект новый класс User:

public class User < public int Id < get; set; >public string Name < get; set; >public int Age < get; set; >>

Это обычный класс, который содержит некоторое количество автосвойств. Каждое свойство будет сопоставляться с отдельным столбцом в таблице из бд.

Надо отметить, что Entity Framework при работе с Code First требует определения ключа элемента для создания первичного ключа в таблице в бд. По умолчанию при генерации бд EF в качестве первичных ключей будет рассматривать свойства с именами Id или [Имя_класса]Id (то есть UserId). Если же мы хотим назвать ключевое свойство иначе, то нам нужно будет внести дополнительную логику на c#.

Теперь для взаимодействия с бд нам нужен контекст данных. Это своего рода посредник между бд и классами, описывающими данные. Но, у нас по умолчанию еще не добавлена библиотека для EF. Чтобы ее добавить, нажмем на проект правой кнопкой мыши и выберем в контекстном меню Manage NuGet Packages.

Добавление Entity Framework через NuGet

Затем в появившемся окне управления NuGet-пакетами в окне поиска введем слово «Entity» и выберем пакет собственно Entity Framework и установим его:

Установка Entity Framework

После установки пакета добавим в проект новый класс UserContext:

using System; using System.Collections.Generic; using System.Data.Entity; namespace FirstEF6App < class UserContext : DbContext < public UserContext() :base("DbConnection") < >public DbSet Users < get; set; >> >

Основу функциональности Entity Framework составляют классы, находящиеся в пространстве имен System.Data.Entity. Среди всего набора классов этого пространства имен следует выделить следующие:

  • DbContext : определяет контекст данных, используемый для взаимодействия с базой данных.
  • DbModelBuilder : сопоставляет классы на языке C# с сущностями в базе данных.
  • DbSet/DbSet : представляет набор сущностей, хранящихся в базе данных

В любом приложении, работающим с БД через Entity Framework, нам нужен будет контекст (класс производный от DbContext) и набор данных DbSet, через который мы сможем взаимодействовать с таблицами из БД. В данном случае таким контекстом является класс UserContext.

В конструкторе этого класса вызывается конструктор базового класса, в который передается строка «DbConnection» — это имя будущей строки подключения к базе данных. В принципе мы можем не использовать конструктор, тогда в этом случае строка подключения носила бы имя самого класса контекста данных.

И также в классе определено одно свойство Users, которое будет хранить набор объектов User. В классе контекста данных набор объектов представляет класс DbSet . Через это свойство будет осуществляться связь с таблицей объектов User в бд.

И теперь нам надо установить подключение к базе данных. Для установки подключения обычно используется файл конфигурации приложения. В проектах для десктопных приложений файл конфигурации называется App.config (как в нашем случае), в проектах веб-приложений — web.config . В нашем случае, поскольку у нас консольное приложение, это файл App.config . После добавления Entity Framework он выглядит примерно следующим образом:

Содержимое файла в каждом конкретном случае может отличаться. Но в любом случае после добавления EntityFramework в проект в нем будет содержаться элемент configSections. И после закрывающего тега добавим следующий элемент:

Все подключения к источникам данных устанавливаются в секции connectionStrings , а каждое отдельное подключение представляет элемент add . В конструкторе класса контекста UserContext мы передаем в качестве названия подключения строку «DbConnection», поэтому данное название указывается в атрибуте name=»DBConnection» .

Настройку строки подключения задает атрибут connectionString . В данном случае мы устанавливаем название базы данных, с которой будем взаимодействовать — userstore.

Теперь перейдем к файлу Program.cs и изменим его содержание следующим образом:

using System; namespace FirstEF6App < class Program < static void Main(string[] args) < using(UserContext db = new UserContext()) < // создаем два объекта User User user1 = new User < Name = "Tom", Age = 33 >; User user2 = new User < Name = "Sam", Age = 26 >; // добавляем их в бд db.Users.Add(user1); db.Users.Add(user2); db.SaveChanges(); Console.WriteLine("Объекты успешно сохранены"); // получаем объекты из бд и выводим на консоль var users = db.Users; Console.WriteLine("Список объектов:"); foreach(User u in users) < Console.WriteLine(". - ", u.Id, u.Name, u.Age); > > Console.Read(); > > >

Так как класс UserContext через родительский класс DbContext реализует интерфейс IDisposable , то для работы с UserContext с автоматическим закрытием данного объекта мы можем использовать конструкцию using .

В конструкции using создаются два объекта User и добавляются в базу данных. Для их сохранения нам достаточно использовать метод Add : db.Users.Add(user1)

Чтобы получить список данных из бд, достаточно воспользоваться свойством Users контекста данных: db.Users

В результате после запуска программа выведет на консоль:

Объекты успешно сохранены Список объектов: 1.Tom - 33 2.Sam - 26

Таким образом, Entity Framework обеспечивает простое и удобное управление объектами из базы данных. При том в данном случае нам не надо даже создавать базу данных и определять в ней таблицы. Entity Framework все сделает за нас на основе определения класса контекста данных и классов моделей. И если база данных уже имеется, то EF не будет повторно создавать ее.

Наша задача — только определить модель, которая будет храниться в базе данных, и класс контекста. Поэтому данный подход называется Code First — сначала пишется код, а потом по нему создается база данных и ее таблицы.

Возникает вопрос, а где же находится БД? Чтобы физически увидеть базу данных, мы можем подключиться к ней из Visual Studio через окно View->SQL Server Object Explorer . После этого мы можем увидеть в SQL Server Object Explorer созданную базу данных, посмотреть ее строение, таблицы, открыть и даже изменить данные в таблицах:

SQL Server Object Explorer в Visual Studio

Физически база данных по умолчанию будет располагаться в папке пользователя, в частности, у меня она размещена в каталоге C:\Users\Eugene\ , только к ее названию буде добавляться стандартное расширение mdf — userstore.mdf.

Вставка данных

В предыдущих статьях мы уже видели как загрузить данные из базы данных в память приложения с использованием Entity Framework. Вы уже могли наглядно убедиться в главном преимуществе Entity Framework, которое заключается во взаимодействии с базой данных с помощью управляемого кода C# без использования SQL-инструкций. Выборка данных – это только половина доступных возможностей для работы с базой данных. Большинству приложений также необходимо вносить изменения в эти данные, путем вставки, удаления или обновления данных, а затем отражать все эти изменения в базе данных.

В этой статье мы рассмотрим, как можно вставлять новые записи в таблицу базы данных, а в последующих статьях рассмотрим вопросы обновления и удаления данных. Стоит отметить, что для сохранения любых изменений используется метод SaveChanges() класса контекста DbContext.

Метод SaveChanges() будет вызывать обновление в источнике данных, который отвечает за перевод изменений в сущностных объектах в правильные инструкции SQL, которые выполняются с базой данных. Т.к. Entity Framework известно о связях между таблицами, определяемых с помощью навигационных свойств, этот фреймворк обеспечит создание нужных SQL-инструкций, чтобы эти изменения применялись в правильном порядке. В контексте нашего примера, вы можете, например, удалить покупателя. Entity Framework автоматически распознает связь между классами модели Customer и Order и удалит все связанные с покупателем заказы. Это говорит о том, что Entity Framework позволяет вносить изменения, которые автоматически влияют на отдельные объекты, на пару связанных объектов или на весь граф объектов.

Вставка одного объекта

Добавление нового объекта с помощью Entity Framework является простой операцией нужно только создать новый экземпляр вашего объекта и добавить его в коллекцию сущностных объектов DbSet с помощью метода Add(). Ниже показан пример, как мы можем вставить нового пользователя в базу данных (мы используем все тот же проект консольного приложения с которым работали в предыдущих статьях):

public static void AddNewCustomer() < SampleContext context = new SampleContext(); // Создать нового покупателя Customer customer = new Customer < FirstName = "Иван", LastName = "Иванов", Age = 30 >; // Добавить в DbSet context.Customers.Add(customer); // Сохранить изменения в базе данных context.SaveChanges(); >

При сохранении изменений в базе данных с помощью метода SaveChanges(), Entity Framework сгенерирует следующий SQL-запрос:

INSERT [dbo].[Customers]([FirstName], [LastName], [Email], [Age], [Photo]) VALUES (@0, @1, NULL, @2, NULL) SELECT [CustomerId] FROM [dbo].[Customers] WHERE @@ROWCOUNT > 0 AND [CustomerId] = scope_identity()

Обратите внимание на отображение нашего управляемого кода на этот SQL-запрос. Для вставки значений используются переменные @0, @1 и @2. Они инициализируются при компиляции приложения. Также, после инструкции INSERT следует инструкция SELECT, которая выбирает значение первичного ключа (в нашем случае CustomerId) для вновь вставленной записи. Благодаря этому, Entity Framework передает значение этого ключа переменной customer в коде. Т.е. после вставки данных, мы можем изменить или удалить этот объект, не извлекая его снова из базы. Чтобы убедиться, что EF инициализирует свойство первичного ключа в объекте модели при вставке в базу данных, можно изменить немного предыдущий пример:

public static void AddNewCustomer() < // . Console.WriteLine("ID до сохранения в базе: ",customer.CustomerId); // Сохранить изменения в базе данных context.SaveChanges(); Console.WriteLine("ID после сохранения в базе: ", customer.CustomerId); >

Ниже показан вывод в консоли после запуска этого примера:

Изменение идентификатора объекта при его вставке в базу данных

Вставка связанных объектов

Связи между таблицами в Entity Framework описываются с помощью навигационных свойств. В нашей модели существует связь один-ко-многим между классами Customer и Order, которая выражается с помощью пары навигационных свойств Customer.Orders и Order.Customer. Если навигационное свойство имеет тип ссылки, то для вставки связанных данных нужно просто инициализировать это свойство. Если навигационное свойство имеет тип коллекции, то нужно использовать ее метод Add() для добавления новой записи. Следует помнить, что изменения могут быть сделаны с одного или с двух концов связи (если используется пара навигационных свойств).

Давайте предположим, что нам нужно вставить новый заказ для добавленного в предыдущем примере пользователя “Иван Иванов”:

public static void AddNewOrder() < SampleContext context = new SampleContext(); // Нужно извлечь сначала покупателя, // которому добавляется заказ Customer ivan = context.Customers .Where(c =>c.LastName == "Иванов") .FirstOrDefault(); // Создаем заказ Order order = new Order < ProductName = "Яблоки", Quantity = 5, PurchaseDate = DateTime.Now, // Ссылка на покупателя в навигационном свойстве Customer = ivan >; context.Orders.Add(order); context.SaveChanges(); >

В этом примере мы извлекаем пользователя с фамилией “Иванов” и добавляем для него новый заказ. Как видите, мы извлекаем все данные пользователя в первом запросе. Если таблица Customers содержит много столбцов с большим объемом данных, то такой подход плохо влияет на производительность. В таком случае можно извлечь только первичный ключ для покупателя (свойство CustomerId), а экземпляру класса Order добавить не ссылку в навигационном поле, а инициализировать внешний ключ. В примере нашей модели мы не определяли явно внешний ключ в классе Order, поэтому Code-First генерировал внешний ключ автоматически. Чтобы использовать описанный выше прием, мы должны будем добавить явно внешний ключ в класс Order:

public class Order < // . // Внешний ключ [ForeignKey("Customer")] public int UserId < get; set; >// Навигационные свойства public Customer Customer < get; set; >public List Lines < get; set; >>

Перед тем, как перейти к следующему примеру вы должны воссоздать базу данных с этой новой моделью, используя инициализаторы базы данных или удаляя ее вручную, как это описывалось при обсуждении Code-First. Теперь можно будет использовать этот внешний ключ в экземпляре класса Order:

public static void AddNewOrder() < SampleContext context = new SampleContext(); // Извлечь только Id покупателя int idIvan = context.Customers .Where(c =>c.LastName == "Иванов") .Select(c => c.CustomerId) .FirstOrDefault(); // Создаем заказ Order order = new Order < ProductName = "Яблоки", Quantity = 5, PurchaseDate = DateTime.Now, // Ссылка на покупателя во внешнем ключе UserId = idIvan >; context.Orders.Add(order); context.SaveChanges(); > 

В предыдущих примерах мы добавляли новый связанный объект для уже существующего базового объекта. В примере ниже показано, как при создании базового объекта, можно добавить сразу связанные объекты в одном запросе. Здесь мы создаем нового покупателя Петр Петров с двумя новыми заказами:

Customer customer = new Customer < FirstName = "Петр", LastName = "Петров", Age = 30, Orders = new List< new Order < ProductName = "Яблоки", Quantity = 8, PurchaseDate = DateTime.Now >, new Order < ProductName = "Апельсины", Quantity = 5, PurchaseDate = DateTime.Now >> >; context.Customers.Add(customer); context.SaveChanges();

Для этого примера Entity Framework создаст три SQL-запроса INSERT – один для вставки нового покупателя, а два для вставки связанных с ним заказов.

Реализация шаблона “найти или вставить”

В вашем приложении возможно понадобится реализовать простой шаблон “найти или вставить” (find or add), в котором вы проверяете, существует ли объект данных в базе, если нет, то создаете новый объект. Т.к. метод DbSet.Add() возвращает экземпляр сущностного класса модели, реализовать этот шаблон с помощью Entity Framework довольно просто:

public static Customer FindOrAdd(int id) < SampleContext context = new SampleContext(); return context.Customers.Find(id) ?? context.Customers.Add(new Customer < FirstName = ". ", LastName = ". ", Age = 40 >); >

Напомню, что метод Find() ищет переданное ему значение в первичных ключах таблицы. В этом примере используется оператор C# . который проверяет на null выражение стоящее слева от него, и если оно возвращает null, то вызывается выражение справа.

Создание универсального метода вставки

В предыдущей статье, где мы рассматривали создание универсального метода для загрузки данных, мы создали новый класс Repository и обобщенный метод Select(). Давайте создадим подобный метод Insert() для универсальной вставки данных в базу:

public static void Insert(TEntity entity) where TEntity : class < // Настройки контекста SampleContext context = new SampleContext(); context.Database.Log = (s =>System.Diagnostics.Debug.WriteLine(s)); context.Entry(entity).State = EntityState.Added; context.SaveChanges(); > /// /// Запись нескольких полей в БД /// public static void Inserts(IEnumerable entities) where TEntity : class < // Настройки контекста SampleContext context = new SampleContext(); // Отключаем отслеживание и проверку изменений для оптимизации вставки множества полей context.Configuration.AutoDetectChangesEnabled = false; context.Configuration.ValidateOnSaveEnabled = false; context.Database.Log = (s =>System.Diagnostics.Debug.WriteLine(s)); foreach (TEntity entity in entities) context.Entry(entity).State = EntityState.Added; context.SaveChanges(); context.Configuration.AutoDetectChangesEnabled = true; context.Configuration.ValidateOnSaveEnabled = true; >

В этом примере мы создаем два метода, первый из которых служит для вставки одного объекта, а второй вставит коллекцию объектов. Для вставки объекта entity используется средство состояний Entity Framework – альтернативное средство вставки объектов, благодаря которому мы указываем состояние сущностного объекта из перечисления EntityState. В нашем случае мы используем состояние EntityState.Added.

Обратите внимание, что в методе Inserts() мы отключили некоторые настройки конфигурации класса контекста. В частности свойство AutoDetectChangesEnabled отключает создание уведомлений при изменении сущностных данных, а ValidateOnSaveEnabled отключает проверку достоверности запроса при сохранении. Предполагается, что в этом методе могут вставляться тысячи записей, поэтому нужно оптимизировать эти настройки.

Теперь вы можете использовать эти методы для создания простых запросов, не беспокоясь о деталях реализации вставки данных:

static void Main() < Repository.Inserts( new List< new Customer < FirstName = "Сидор", LastName = "Сидоров", Age = 23 >, new Customer < FirstName = "Павел", LastName = "Васин", Age = 20 >>); >

Db Set Класс

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix", Justification="Name is intentional")] [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Justification="Casing is intentional")] public abstract class DbSet : System.Data.Entity.Infrastructure.DbQuery
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1010:CollectionsShouldImplementGenericInterface")] [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix", Justification="Name is intentional")] public abstract class DbSet : System.Data.Entity.Infrastructure.DbQuery
type DbSet = class inherit DbQuery
Public MustInherit Class DbSet Inherits DbQuery

Наследование

Конструкторы

Создает экземпляр при вызове DbSet из конструктора производного типа, который будет использоваться в качестве тестового двойника для DbSets. Методы и свойства, которые будут использоваться тестовым двойником, должны быть реализованы тестом double, за исключением AsNoTracking, AsStreaming и Include, где реализация по умолчанию является неоднородной.

Свойства

Тип элемента IQueryable.

String Возвращает представление базового запроса.

Методы

Добавляет заданную сущность к контексту, поддерживающему набор, в добавленном состоянии, в результате чего она будет вставлена в базу данных при вызове метода SaveChanges.

Добавляет указанную коллекцию сущностей в контекст, лежащий в основе набора, при этом каждая сущность помещается в состояние Added таким образом, что она будет вставлена в базу данных при вызове Метода SaveChanges.

Возвращает новый запрос, в котором возвращенные сущности не будут кэшироваться в .DbContext

Является устаревшей.

Возвращает новый запрос, который будет выполнять потоковую передачу результатов вместо буферизации.

Присоединяет заданную сущность к контексту, поддерживающему данный набор. Это означает, что сущность помещается в контекст в неизмененном состоянии, как если бы она была считана из базы данных.

Возвращает эквивалентный универсальный DbSet объект.

Создает новый экземпляр сущности для типа данного набора. Обратите внимание, что этот экземпляр НЕ добавляется или не присоединяется к набору. Возвращаемый экземпляр будет учетной записью-посредником, если базовый контекст настроен для создания посредников, а тип сущности удовлетворяет требованиям для создания учетных записей-посредников.

Создает новый экземпляр сущности для типа данного набора или для типа, производного от типа данного набора. Обратите внимание, что этот экземпляр НЕ добавляется или не присоединяется к набору. Возвращаемый экземпляр будет учетной записью-посредником, если базовый контекст настроен для создания посредников, а тип сущности удовлетворяет требованиям для создания учетных записей-посредников.

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

Асинхронно находит сущность с заданными значениями первичного ключа. Если сущность с указанными значениями первичного ключа содержится в контексте, она возвращается немедленно без выполнения запроса к хранилищу. В противном случае выполняется запрос к хранилищу в поисках сущности с указанными значениями первичного ключа. Если такая сущность обнаружена, она добавляется к контексту и возвращается вызывающей стороне. Если сущность не обнаружена в контексте или в хранилище, возвращается значение NULL.

Асинхронно находит сущность с заданными значениями первичного ключа. Если сущность с указанными значениями первичного ключа содержится в контексте, она возвращается немедленно без выполнения запроса к хранилищу. В противном случае выполняется запрос к хранилищу в поисках сущности с указанными значениями первичного ключа. Если такая сущность обнаружена, она добавляется к контексту и возвращается вызывающей стороне. Если сущность не обнаружена в контексте или в хранилище, возвращается значение NULL.

Задает связанные объекты, включаемые в результаты запроса.

Помечает заданную сущность как удаленную, в результате чего она будет удалена из базы данных при вызове метода SaveChanges. Обратите внимание, что перед вызовом этого метода сущность должна существовать в контексте в каком-либо другом состоянии.

Удаляет указанную коллекцию сущностей из контекста, лежащего в основе набора, при этом каждая сущность помещается в состояние Deleted таким образом, что она будет удалена из базы данных при вызове Метода SaveChanges.

Создает необработанный SQL-запрос, возвращающий сущности в данном наборе. По умолчанию возвращаемые сущности отслеживаются контекстом; Это можно изменить, вызвав AsNoTracking в возвращаемом объекте DbRawSqlQuery . Обратите внимание, что возвращаемые сущности всегда относятся к типу для этого набора и никогда не имеют производного типа. Если запрашиваемая таблица или таблицы могут содержать данные других типов сущностей, SQL-запрос должен быть написан соответствующим образом, обеспечивая возврат только сущностей нужного типа.

Как и в случае с любым API, который принимает SQL, важно параметризовать любые входные данные пользователя для защиты от атак путем внедрения кода SQL. Вы можете включить заполнители параметров в строку ЗАПРОСА SQL, а затем указать значения параметров в качестве дополнительных аргументов. Все значения параметров, которые вы указали, будут автоматически преобразованы в DbParameter. Контексте. Set(typeof(Blog)). SqlQuery(«SELECT * FROM dbo. Posts WHERE Author = @p0», userSuppliedAuthor); Кроме того, можно создать DbParameter и передать его в SqlQuery. Это позволяет использовать именованные параметры в строке SQL-запроса. Контексте. Set(typeof(Blog)). SqlQuery(«SELECT * FROM dbo. Публикует where Author = @author», new SqlParameter(«@author», userSuppliedAuthor));

Возвращает представление String базового запроса.

Явные реализации интерфейса

Возвращает объект , IDbAsyncEnumerator который при перечислении будет выполнять запрос к базе данных.

Возвращает объект , IEnumerator который при перечислении будет выполнять запрос к базе данных.

Вызывает исключение, указывающее, что прямая привязка к запросу к хранилищу не поддерживается. Вместо этого заполните dbSet данными, например с помощью метода расширения Load, а затем привяжите его к локальным данным. Для WPF привязать к DbSet.Local. Для Windows Forms выполняйте привязку к DbSet.Local.ToBindingList().

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *