Новичок: "Как использовать Entity Framework? SOS!"
Профессионал: "Попробуйте использовать SOD-фреймворк!"
Проблемы с использованием EF и постоянно сталкиваешьесь с трудностями? Может стоит отказаться от этого и попробовать SOD-фреймворк! Это легкий и простой в использовании фреймворк, а также решение для корпоративного уровня данных.
Недостатки 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-фреймворка и включает следующие функции:
XML SQL конфигурация и Map DAL — базируются на XML-конфигурации для SQL-запросов и маппинга данных доступного уровня
SQL Map Entity — маппинг SQL-выражений в объекты-сущности
OQL (ORM Query Language) — ORM-запросный язык: OQL
Data Container — контейнер данных
Entity Indexer — индексатор сущностей для доступа к данным
Table Map Route Query — поддержка распределенной таблицы запросов
Micro ORM — микроОРМ
Устойчивый доступ к данным — технология согласованного доступа к данным
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 в рамках простого SOD-фреймворка:
Перед началом работы создайте консольный проект, а затем в пакетной командной строке NuGet добавьте пакет SOD-фреймворка:
Install-Package PDF.NET.SOD
Это позволит получить последнюю версию SOD-фреймворка и добавить необходимые ссылки. После этого можно приступить к работе.
Скачать текущий демонстрационный проект здесь.
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"
Для получения более подробной информации о настройках соединения с базой данных обратитесь к книге автора «SOD-фреймворк: практика предприятия».
// Создание базы данных и таблиц
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
Конечно, способов вставки данных существует множество, подробнее смотрите исходный код, предоставляемый в данной статье.
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 )