WatsonORM.Core 3.0.5

There is a newer version of this package available.
See the version list below for details.
dotnet add package WatsonORM.Core --version 3.0.5                
NuGet\Install-Package WatsonORM.Core -Version 3.0.5                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="WatsonORM.Core" Version="3.0.5" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add WatsonORM.Core --version 3.0.5                
#r "nuget: WatsonORM.Core, 3.0.5"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install WatsonORM.Core as a Cake Addin
#addin nuget:?package=WatsonORM.Core&version=3.0.5

// Install WatsonORM.Core as a Cake Tool
#tool nuget:?package=WatsonORM.Core&version=3.0.5                

alt tag

WatsonORM

Library Version Downloads
WatsonORM (all supported database types) NuGet Version NuGet
WatsonORM.Mysql NuGet Version NuGet
WatsonORM.Postgresql NuGet Version NuGet
WatsonORM.Sqlite NuGet Version NuGet
WatsonORM.SqlServer NuGet Version NuGet
WatsonORM.Core NuGet Version NuGet

Description

WatsonORM is a lightweight and easy to use object-relational mapper (ORM) in C# for .NET Core built on top of DatabaseWrapper. WatsonORM supports Microsoft SQL Server, Mysql, MariaDB, PostgreSQL, and Sqlite databases, both on-premises and in the cloud.

Core features:

  • Annotate classes and automatically create database tables
  • Quickly create, read, update, or delete database records using your own objects
  • Reduce time-to-production and time spent building scaffolding code
  • Programmatic table creation and removal

For a sample app exercising this library, refer to the Test project contained within the solution.

New in v3.0.x

  • Dependency update
  • Minor breaking changes
  • Async API support

Special Thanks

We'd like to give special thanks to those who have contributed or helped make the library better!

@Maclay74 @flo2000ace @MacKey-255

Simple Example

This example uses Sqlite. For SqlServer, Mysql, or Postgresql, you must make sure the database exists. Tables will be automatically created in this example. Refer to the Test project for a complete example.

using ExpressionTree;
using DatabaseWrapper.Core;
using Watson.ORM;
using Watson.ORM.Core;

// Apply attributes to your class
[Table("person")]
public class Person
{
  [Column("id", true, DataTypes.Int, false)]
  public int Id { get; set; }

  [Column("firstname", false, DataTypes.Nvarchar, 64, false)]
  public string FirstName { get; set; }

  // Parameter-less constructor is required
  public Person()
  {
  }
}

// Initialize
DatabaseSettings settings = new DatabaseSettings("./WatsonORM.db");
WatsonORM orm = new WatsonORM(settings);
orm.InitializeDatabase();
orm.InitializeTable(typeof(Person)); // initialize one table
orm.InitializeTables(new List<Type> { typeof(Person) }); // initialize multiple tables

// Insert 
Person person = new Person { FirstName = "Joel" };
Person inserted = orm.Insert<Person>(person);

// Select
Person selected = orm.SelectByPrimaryKey<Person>(1); 

// Select all records
List<Person> people = orm.SelectMany<Person>();

// Select many by column name
Expr e1 = new Expr("id", OperatorEnum.GreaterThan, 0);
people = orm.SelectMany<Person>(e1);

// Select many by property
Expr e2 = new Expr(
  orm.GetColumnName<Person>(nameof(Person.Id)),
  DbOperators.GreaterThan,
  0);
people = orm.SelectMany<Person>(e2);

// Select many by property with pagination
// Retrieve 50 records starting at record number 10
people = orm.SelectMany<Person>(10, 50, e2);

// Select many with descending order
ResultOrder[] resultOrder = new ResultOrder[1];
resultOrder[0] = new ResultOrder("id", OrderDirectionEnum.Descending);
people = orm.SelectMany<Person>(null, null, e2, resultOrder);

// Update
inserted.FirstName = "Jason";
Person updated = orm.Update<Person>(inserted);

// Delete
orm.Delete<Person>(updated); 

Column Naming

Columns can be named explicitly by specifying the colum name in the Column attribute constructor. Alternatively, constructors that don't include a name can be used, in which case the name of the property will be used as the column name.

Example with explicit naming:

[Column("id", true, DataTypes.Int, false)] // column name "id"
public int Id { get; set; }

[Column("firstname", false, DataTypes.Nvarchar, 64, false)] // column name "firstname"
public string FirstName { get; set; }

Example without explicit naming:

[Column(true, DataTypes.Int, false)] // column name "Id"
public int Id { get; set; }

[Column(DataTypes.Nvarchar, 64, false)] // column name "FirstName"
public string FirstName { get; set; }

Pagination with SelectMany

SelectMany can be paginated by using the method with either signature (int? indexStart, int? maxResults, Expr expr) or (int? indexStart, int? maxResults, Expr expr, ResultOrder[] resultOrder). indexStart is the number of records to skip, and maxResults is the number of records to retrieve.

Paginated results are always ordered by the primary key column value in ascending order, i.e. ORDER BY id ASC in the Person example above.

Validating One or More Tables

If you wish to determine if there are any errors or warnings associated with a given Type, use either the ValidateTable or ValidateTables API:

List<string> errors = new List<string>();
List<string> warnings = new List<string>();

// validate a single table
bool success = orm.ValidateTable(typeof(Person), out errors, out warnings);

// validate multiple tables
bool success = orm.ValidateTables(new List<Type> 
  {
    typeof(Person),
    typeof(Order),
    typeof(Inventory)
  },
  out errors,
  out warnings);

if (errors.Count > 0) 
  foreach (string error in errors) Console.WriteLine(error);

if (warnings.Count > 0) 
  foreach (string warning in warnings) Console.WriteLine(warning);

Using Sqlite

Sqlite may not work out of the box with .NET Framework. In order to use Sqlite with .NET Framework, you'll need to manually copy the runtimes folder into your project output directory. This directory is automatically created when building for .NET Core. To get this folder, build the Test.Sqlite project and navigate to the bin/[debug||release]/[netcoreapp*||net5.0||net6.0] directory. Then copy the runtimes folder into the project output directory of your .NET Framework application.

Using SQL Server

In order to use pagination with SQL Server, the SelectMany method containing the ResultOrder[] resultOrder parameter must be used.

Using MySQL

While the DateTimeOffset type can be used in objects, with MySQL the offset is not persisted. It is recommended that you store UTC timestamps using the DateTime type instead.

Using MariaDB

Use the MySQL constructor. MySQL constraints apply.

Version history

Refer to CHANGELOG.md.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.1 is compatible. 
.NET Framework net461 is compatible.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 is compatible.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (4)

Showing the top 4 NuGet packages that depend on WatsonORM.Core:

Package Downloads
WatsonORM.Sqlite

WatsonORM is a lightweight and easy to use object-relational mapper (ORM) for Sqlite in C# for .NET Core, .NET Framework, and .NET Standard built on top of DatabaseWrapper. Refer to other WatsonORM packages if you need support for other database types.

WatsonORM.Mysql

WatsonORM is a lightweight and easy to use object-relational mapper (ORM) for MySQL in C# for .NET Core, .NET Framework, and .NET Standard built on top of DatabaseWrapper. Refer to other WatsonORM packages if you need support for other database types.

WatsonORM.SqlServer

WatsonORM is a lightweight and easy to use object-relational mapper (ORM) for SQL Server in C# for .NET Core, .NET Framework, and .NET Standard built on top of DatabaseWrapper. Refer to other WatsonORM packages if you need support for other database types.

WatsonORM.Postgresql

WatsonORM is a lightweight and easy to use object-relational mapper (ORM) for PostgreSQL in C# for .NET Core, .NET Framework, and .NET Standard built on top of DatabaseWrapper. Refer to other WatsonORM packages if you need support for other database types.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
3.0.9 326 9/19/2024
3.0.8 501 10/4/2023
3.0.6 2,627 9/30/2023
3.0.5 422 9/30/2023
3.0.3 1,140 8/29/2023
3.0.2 3,084 7/11/2023
3.0.1 179 7/11/2023
3.0.0 189 7/11/2023
2.1.2 2,566 2/3/2023
2.1.1 299 2/3/2023
2.1.0 4,141 10/25/2022
2.0.3 451 10/25/2022
2.0.2.2 2,208 10/4/2022
2.0.2.1 404 10/4/2022
2.0.2 443 10/4/2022
2.0.1.1 5,615 9/4/2022
2.0.1 4,025 6/21/2022
2.0.0.5 3,614 5/27/2022
2.0.0.4 733 1/8/2022
2.0.0.3 3,921 1/3/2022
2.0.0.2 332 1/3/2022
2.0.0.1 343 1/3/2022
2.0.0 319 1/3/2022
1.3.5.3 4,560 11/12/2021
1.3.2.1 11,159 4/14/2021
1.3.2 387 4/14/2021
1.3.0.22 9,831 12/29/2020
1.3.0.19 8,657 11/15/2020
1.3.0.18 494 11/15/2020
1.3.0.14 14,109 10/15/2020
1.3.0.13 520 10/6/2020
1.3.0.12 3,856 9/19/2020
1.2.0.4 8,925 9/8/2020
1.2.0.3 6,432 9/8/2020
1.2.0.2 28,613 6/19/2020
1.2.0.1 5,169 6/11/2020
1.2.0 29,307 6/11/2020
1.1.2.1 4,396 6/4/2020
1.1.2 1,804 6/3/2020
1.1.1.1 2,575 5/28/2020
1.1.1 1,713 5/28/2020
1.1.0.10 1,382 5/22/2020
1.1.0.4 3,543 5/21/2020
1.1.0.3 2,366 5/21/2020
1.1.0.1 526 5/20/2020
1.1.0 512 5/20/2020

Better support for updating multiple objects