1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/znlgis-sod

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README-en.md

Новичок: "Как использовать Entity Framework? SOS!"

Профессионал: "Попробуйте использовать SOD-фреймворк!"

Проблемы с использованием EF и постоянно сталкиваешьесь с трудностями? Может стоит отказаться от этого и попробовать SOD-фреймворк! Это легкий и простой в использовании фреймворк, а также решение для корпоративного уровня данных.


1. Почему нужен SOD-фреймворк — Why Need the SOD Framework

Недостатки Entity Framework или большинства ORM-фреймворков являются преимуществами SOD-фреймворка; он имеет более чем 15 лет истории применения в проектах, создан специально для вас!

The disadvantages of Entity Framework or most ORM frameworks are the advantages of SOD framework; it has over 15 years of project application history and was created specifically for you!

SOD не является просто ORM-фреймворком, но также включает SQL-MAP, DataControls, при этом являясь очень лёгким фреймворком, а также решением для корпоративного уровня данных. Узнайте больше здесь.

SOD is not just an ORM framework, but also includes SQL-MAP, DataControls, making it a very lightweight framework, as well as an enterprise-level data application development solution. Learn more here.


Начало 2006-06-06

SOD-фреймворк особенно подходит для следующих типов корпоративных проектов:1. Финансовая отрасль с жесткими требованиями к безопасности операций с данными; 2. Интернет-индустрия с строгими требованиями к скорости доступа к данным, памяти и ресурсам процессора; 3. Проекты, где требования часто меняются, а проекты регулярно переопределяются, требуют быстрого развития и запуска в эксплуатацию; 4. Корпоративные приложения, требующие высокой стабильности и долгосрочного обслуживания, такие как системы управления информацией (MIS), системы управления предприятием (ERP) и системы управления производственным оборудованием (MES); 5. Проекты малого и среднего размера, требующие низкозатратного развития и сотрудников со слабыми навыками.SOD框架仍然是少数支持.NET 2.0的框架之一。 Конечно же, он также поддерживает .NET 3.x, .NET 4.x, а также .NET Core и вот-вот выйдет .NET 5.# 2. Функциональные возможности

SOD-фреймворк развился из PDF.NET-фреймворка и включает следующие функции:

Основные три функции (S, O, D):

SQL-MAP

XML SQL конфигурация и Map DAL — базируются на XML-конфигурации для SQL-запросов и маппинга данных доступного уровня
SQL Map Entity — маппинг SQL-выражений в объекты-сущности

ORM

OQL (ORM Query Language) — ORM-запросный язык: OQL
Data Container — контейнер данных
Entity Indexer — индексатор сущностей для доступа к данным
Table Map Route Query — поддержка распределенной таблицы запросов
Micro ORM — микроОРМ

Data Controls

Устойчивый доступ к данным — технология согласованного доступа к данным
Web Form Data Controls — данные управления для веб-форм
Windows Form Data Controls — данные управления для оконных форм

Полезные компоненты:

Горячий кэш использования — кэширование наиболее часто используемых данных
Бинарная сериализация — бинарная сериализация данных
Журнал запросов — журнал запросов
Командная труба — командная труба
Распределенное идентификационное число — распределенное идентификаторное число

Корпоративные решения:

MVVM (Web/Windows Forms) — MVVM для данных формы
Памятная база данных — памятная база данных
Журнал транзакций данных — репликация данных журнала транзакций
Синхронизация данных — синхронизация данных
Распределенная транзакция — распределенная транзакция
OData клиент — клиент OData## Инструменты:

Интегрированное средство разработки — интегрированное средство разработки, которое включает генерацию сущностных классов, автоматическое создание кода SQL-MAP и различные средства доступа к базам данных.
Поддержка NuGet — поддержка NuGet

Исходный код и сообщество:

Код: https://github.com/znlgis/sod или https://gitee.com/znlgis/sod
Домашняя страница: [http://www.pwmis.com/sqlmap](http://www.pwmis.com/sqlmap)
Блог: [https://www.cnblogs.com/bluedoctor](https://www.cnblogs.com/bluedoctor)
Группа QQ: 18215717, 154224970 Для получения более подробной информации смотрите [этот раздел](https://www.cnblogs.com/bluedoctor/p/4306131.html).

Или обратитесь к книге, написанной автором фреймворка: «Практическое руководство по SOD-фреймворку для корпоративных приложений».

Пример простого использования ORM — Простой пример использования ORM

Приведенный ниже пример использования ORM в рамках простого SOD-фреймворка:

Перед началом работы создайте консольный проект, а затем в пакетной командной строке NuGet добавьте пакет SOD-фреймворка:

Install-Package PDF.NET.SOD

Это позволит получить последнюю версию SOD-фреймворка и добавить необходимые ссылки. После этого можно приступить к работе.

Скачать текущий демонстрационный проект здесь.

    1. Создайте сущностный класс:
public class User : EntityBase
{
    public User()
    {
        TableName = "Tb_User";
        IdentityName = "UserID";
        PrimaryKeys.Add("UserID");
    }
}
``````markdown
public int Id
{
    get { return getProperty<int>("UserID"); }
    set { setProperty("UserID", value); }
}

public string Name
{
    get { return getProperty<string>("Name"); }
    set { setProperty("Name", value, 50); }
}

public string Password
{
    get { return getProperty<string>("Pwd"); }
    set { setProperty("Pwd", value, 50); }
}
}

В SOD-фреймворке сущностные классы используют "динамическое метаданные отображение". Эти метаданные включают имя таблицы, внешние ключи, первичные ключи, имя поля идентификатора, типы полей, длину и т.д. Все эти метаданные могут быть изменены во время выполнения программы, что отличает его от подхода к отображению сущностей в Entity Framework и других ORM-фреймворках. Эта особенность позволяет полностью определять сущностные классы и их метаданные в одном классе кода, не завися от .NET-определений. Динамический характер позволяет SOD-фреймворку избавиться от сложного процесса отображения метаданных баз данных, упрощая конфигурацию доступа к данным и легко поддерживающий "разделенные таблицы" и "разделенные базы данных".

Отображение метаданных может быть "логическим", то есть указывать на отображаемый внешний ключ, хотя сам внешний ключ может отсутствовать в базе данных, или указывать на виртуальный первичный ключ. Также возможно не использовать никакое отображение метаданных, тогда сущностный класс будет использоваться как аналог объекта типа "словарь" или для UI-слоя данных.

```c#
IUser user = EntityBuilder.CreateEntity<IUser>();
```* 2, затем создайте объект `DbContext`:

```c#
class LocalDbContext : DbContext
{
    public LocalDbContext()
        : base("local")
    {
        // local — это имя строки подключения
    }

    protected override bool CheckAllTableExists()
    {
        // Создание таблицы пользователей
        CheckTableExists<User>();
        return true;
    }
}
  • Примечание: Этот шаг необходим только при использовании подхода Code First. Если таблицы уже существуют, этот шаг можно пропустить, хотя в этом случае код ниже потребует некоторых изменений.

  • 3, измените конфигурацию соединения в файле App.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <connectionStrings>
        <add name="local" connectionString="Data Source=.;database=TestDB;Integrated Security=True" providerName="SqlServer"/>
    </connectionStrings>
</configuration>

providerName представляет собой имя данных доступа SOD-фреймворка, которое PWMIS.Core.dll предоставляет как набор сокращённых имен: Access | SqlServer | Oracle | SqlCe | OleDb | Odbc.

Для других распространённых баз данных, таких как MySQL/Oracle/PostgreSQL/SQLite, SOD-фреймворк также обеспечивает поддержку (через расширяемые сборки), при условии наличия ADO.NET-драйвера для базы данных.

Если используется другой расширенный модуль, то providerName следует указывать следующим образом:

providerName="<полное имя класса провайдера>,<сборка, содержащая класс>"Например, использование SOD-обёртки для официального Oracle ADO.NET-провайдера:

providerName="PWMIS.DataProvider.Data.OracleDataAccess.Oracle,PWMIS.OracleClient"
  • Примечание: Расширенный модуль должен находиться в том же каталоге, что и PWMIS.Core.dll, и иметь совместимую версию.

Для получения более подробной информации о настройках соединения с базой данных обратитесь к книге автора «SOD-фреймворк: практика предприятия».

    1. Далее используйте код следующим образом, чтобы автоматически создать базу данных и таблицы, а также добавить начальные данные:
// Создание базы данных и таблиц
LocalDbContext context = new LocalDbContext();

// Установка нового ключа и удаление старых тестовых данных
User oldUser = new User();
oldUser.PrimaryKeys.Clear();
oldUser.PrimaryKeys.Add("Name");
oldUser["Name"] = "zhang san"; // использование индексатора
int count = context.Remove<User>(oldUser);

User zhang_san = new User() { Name = "zhang san", Pwd = "123" };
count = context.Add<User>(zhang_san); // добавление данных через DbContext

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

    1. Наконец, используйте запрос следующим образом:
User user = new User() { Name = "zhang san" };
OQL q = OQL.From(user)
    .Select()
    .Where(user.Name)
    .End();

PrintOQL(q);
List<User> users = EntityQuery<User>.QueryList(q);

Этот подход подходит для простых условий равенства. Для более сложных условий можно использовать следующую конструкцию:```c# // Пример использования операторов сравнения через перегрузку User user = new User(); OQL q = OQL.From(user) .Select() .Where(cmp => cmp.Property(user.Name) == "zhang san") .END; PrintOQL(q); // Используем расширение методов using PWMIS.Core.Extensions; List users = q.ToList();


Пример кода может быть модифицирован до `>, <, LIKE` и других символов сравнения, поддерживаемых SQL.

Если вам нужны более сложные условия, вы можете использовать `&&` для логического соединителя AND и `||` для OR, как показано ниже:

```c#
// Пример использования операторов сравнения через перегрузку
User user = new User();
OQL q = OQL.From(user)
            .Select()
            .Where(cmp => cmp.Property(user.Name) == "zhang san"
                        && cmp.Comparer(user.Pwd, "=", "123"))
.END;
PrintOQL(q);
// Используем расширение методов using PWMIS.Core.Extensions;
List<User> users = q.ToList<User>();

На самом деле, фреймворк предлагает как минимум восемь различных способов выполнения запросов. Подробности можно найти в этой статье ".NET ORM «SOD мёд» — нулевой уровень". Если вам требуется выполнить "одиночный запрос к одной таблице", то использование генерического OQL будет лучшим выбором. Например, следующий пример демонстрирует пагинированное чтение данных из таблицы пользователей, автоматически обнаруживая общее количество записей при первом запросе, а затем используя это значение в последующих запросах для эффективной работы:

void Test3(int pageNum, int pageSize)
{
    var goql = OQL.From<User>()
        .Select()
        .OrderBy((o, u) => o.Asc(u.ID));
    // .Limit(pageSize, pageNum, true);
    if (this.txtRecNumber.Text == "0" || this.txtRecNumber.Text == "")
    {
        goql.Limit(pageSize, pageNum, true);  // третий параметр равен true, что позволяет автоматически выявить общее количество записей, удовлетворяющих условиям запроса
    }
    else
    {
        int allCount = int.Parse(this.txtRecNumber.Text);
        goql.Limit(pageSize, pageNum, allCount); // общее количество записей для точной пагинации.
    }
    var list = goql.ToList();
    // Однострочный вариант использования генерического OQL:
    // var list = OQL.From<User>()..Select().OrderBy((o, u) => o.Asc(u.ID)).Limit(pageSize, pageNum, true) ;
    
    this.dataGridView1.DataSource = list;
    int recCount = goql.AllCount;
}

Этот код выполняет сортировку и пагинацию данных, используя объект User и методы OQL для управления запросами.


private static void PrintOQL(OQL q)
{
    Console.WriteLine("OQL to SQL:\r\n{0}", q.ToString());
    Console.WriteLine("SQL Parameters:\r\n{0}", q.PrintParameterInfo());
}

Этот метод позволяет выводить SQL-запросы, сгенерированные из OQL, а также информацию о параметрах SQL.


Таким образом, простой пример использования ORM готов. Приведённый выше пример ORM не только применим к Oracle, но и может использоваться с другими базами данных, достаточно лишь изменить конфигурацию строки подключения (providerName и connectionString).

Дополнительно можно ознакомиться с Oracle бесплатной версией Database 11g и "SOD framework" поддержкой CodeFirst для Oracle.Примечание: OQL также поддерживает сложные объединения нескольких таблиц, как показано ниже:

OQL q = OQL.From(entity1)
           .Join(entity2).On(entity1.PK, entity2.FK)
           //.Select(entity1.Field1, entity2.Field2) // больше нет необходимости указывать свойства для выборки
           .Select()
          .End;
EntityContainer ec = new EntityContainer(q);
var list = ec.MapToList(() =>
{
   return new {
                Property1 = entity1.Field1,
                Property2 = entity2.Field2
              };
});
для каждого(item в списке)
{
    Console.WriteLine("Property1={0}, Property2={1}", item.Property1, item.Property2);
}

Сравнительно с EF и другими ORM-фреймворками, SOD предлагает более удобные способы массового внесения и обновления данных, что можно выполнить через OQL. Например, метод Update OQL позволяет обновлять данные атрибутов указанной сущности, а метод Where используется для указания условий, таких как обновление всех записей с определённым RoleID. Если условия обновления соответствуют нескольким записям, то это обеспечивает эффект "массового обновления".

void TestUpdate()
{
    Users user = new Users()
    {
        AddTime = DateTime.Now.AddDays(-1),
        Authority = "Чтение",
        NickName = "Новичок"
    };

    OQL q = OQL.From(user)
               .Update(user.AddTime, user.Authority, user.NickName)
               .Where(cmp => cmp.Property(user.RoleID) == 100)
               .END;

    Console.WriteLine("OQL обновление:\r\n{0}\r\n", q);
    Console.WriteLine(q.PrintParameterInfo());
}

Программа выводит следующее:

OQL обновление: UPDATE [LT_Users]  SET
      [AddTime] = @P0,
      [Authority] = @P1,
      [NickName] = @P2 
     WHERE  [RoleID] = @P3
```--------Информация о параметрах OQL----------
  имеет 4 параметра, подробнее:
   @P0=2013/7/28 22:15:38      Тип:DateTime
    @P1=Чтение      Тип:String
    @P2=Новичок      Тип:String
    @P3=100      Тип:Int32  
------------------Конец------------------------

Дополнительные примеры использования OQL и его продвинутых возможностей можно найти здесь: Обзор ORM-запросного языка (OQL) -- Примеры

Спасибо за вашу донацию
Добро пожаловать к финансовой поддержке данного проекта, адрес для пожертвований: [официальный сайт](http://www.pwmis.com/sqlmap )

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
LGPL-2.1
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/znlgis-sod.git
git@api.gitlife.ru:oschina-mirror/znlgis-sod.git
oschina-mirror
znlgis-sod
znlgis-sod
master