LINQ to SQL

Определение контекста данных и моделей

Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6

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

LINQ to SQL представляет технологию доступа и управления реляционными данными. Данная технология позволяет составлять запросу к бд в удобной форме в с помощью операторов LINQ, которые затем трансформируются в sql-выражения. Ключевыми объектами здесь являются сущности, которые хранятся в базе данных, контекст данных и запрос LINQ.

Чтобы задействовать LINQ to SQL в проекте, нам надо добавить библиотеку System.Data.Linq.dll:

LINQ to SQL

Для взаимодействия с базой данных в LINQ to SQL используются модели и контекст данных. Модели представляют собой обычные классы, которые сопоставляются с одной из таблиц в базе данных. Пусть у нас есть некоторая база данных usersdb, в которой определена следующая таблица Users:

То есть в таблице Users есть три столбца: Id(тип int), Name(тип nvarchar) и Age(тип int).

Сначала определим сущность для работы с данными из этой таблицы:

using System.Data.Linq.Mapping;

namespace L2SApp
{
    [Table(Name = "Users")]
    public class User
    {
        [Column(IsPrimaryKey = true, IsDbGenerated = true)]
        public int Id { get; set; }
        [Column(Name = "Name")]
        public string FirstName { get; set; }
        [Column]
        public int Age { get; set; }
    }
}

Атрибут [Table] позволяет выполнить сопоставление таблицы из бд с данной моделью. Однако по умолчанию модель должна называться также, как и таблица, то есть Users. Поэтому, чтобы сопоставление прошло успешно, в атрибуте Table указывается свойство Name с именем таблицы.

Каждое свойство модели соответствует столбцу по типу данных. Чтобы происходило автоматическое сопоставление, над свойствами применяется атрибут [Column]. Без данного атрибута система не сможет связать столбец из таблицы со свойством.

Данный атрибут имеет ряд свойств, с помощью которого можно настроить сопоставление столбца:

  • AutoSync: указывает, как надо извлекать значение столбца после вставки или обновления

  • CanBeNull: указывает, может ли столбец принимать значение null

  • DbType: определяет тип столбца. Указывается, если надо создать новую базу данных

  • Expression: хранит выражение, которое будет использоваться для вычисления значения свойства

  • IsPrimaryKey: хранит логическое значение и указывает, выполняет ли столбец роль первичного ключа (как в данном случае Id)

  • IsDbGenerated: хранит логическое значение, которое указывает, будет ли значение столбца генерироваться самой бд

  • IsDiscriminator: указывает, будет ли столбец разграничителем в системе наследования классов

  • IsVersion: указывает, будет ли столбец хранить номер версии строки или значение timestamp, которое указывает на время последнего изменения строки

  • Name: задает имя столбца, с которым будет сопоставляться данное свойство

  • Storage: указывает на имя приватной переменной, которая будет хранить значение данного столбца

  • UpdateCheck: определяет, как LINQ to SQL будет решать проблему параллелизма. Если в модели нет свойств со значение IsVersion=true, то операциях с данными БД будет сравнивать значения строк из таблицы со новыми значениями.

В данном случае название свойства отличается от названия столбца, поэтому в атрибуте надо указать свойство Name, котором передается название столбца, как тут: свойство FirstName будет сопоставляться со столбцом Name.

В классе программы определим следующий код:

using System;
using System.Linq;
using System.Data.Linq;

class Program
{
    static string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";
    static void Main(string[] args) 
    {
        DataContext db = new DataContext(connectionString);

        // Получаем таблицу пользователей
        Table<User> users = db.GetTable<User>();
        
        foreach (var user in users)
        {
            Console.WriteLine("{0} \t{1} \t{2}", user.Id, user.FirstName, user.Age);
        }

        Console.Read();
    }
}

Сначала создается контекст данных, который представлен объектом DataContext. В конструктор этого класса передается строка подключения. Через контекст данных мы будем работать с базой данных.

Затем мы получаем таблицу Users:

Table<User> users = db.GetTable<User>();

Фактически здесь мы загружаем все строки из базы данных, которые преобразуются в объекты User:

DataContext в LINQ to SQL
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850