项目作者: stefanmielke

项目描述 :
Micro ORM for C#
高级语言: C#
项目地址: git://github.com/stefanmielke/DataCore.git
创建时间: 2017-01-11T02:45:51Z
项目社区:https://github.com/stefanmielke/DataCore

开源协议:MIT License

下载


DataCore - Micro ORM for C

DataCore’s goal is to be a FOSS alternative to other ORMs. Focusing on simplicity and developer control over the queries and the database.

It uses Dapper for SQL execution and creates a layer on top of it to ease the query creation and database maintenance.

Download

For now there’s no Nuget version, so you have to download/clone and build the current version from GitHub.

Supported Databases

  • SQLite
  • SQL Server
  • Oracle DB
  • Postgres
  • MariaDB (through MySQL, full support)
  • MySQL (partial - no index support - planned for full release)

Each database has its own project. You can only add what you’ll use.

Usage

Each class represents one table and one table only.

Create a database for a connection using the desired provider and then you can use all methods from it.

Small Example

  1. class User
  2. {
  3. public int Id { get; set; }
  4. public string Name { get; set; }
  5. }
  6. using (var db = new DataCoreDatabase(new SqliteDatabase(), "Data Source=:memory:"))
  7. {
  8. db.CreateTable<User>();
  9. db.Insert(new User { Id = 1, Name = "Test User" });
  10. var user = db.Select<User>(u => u.Id == 1);
  11. }

Simple Selects

Select with Where

  1. db.Select<User>(u => u.Id == 1);

Select one record with Where

  1. db.SelectSingle<User>(u => u.Id == 1);

Select By Id

  1. db.SelectById<User>(1);

Select By Ids

  1. db.SelectById<User>(1, 2, 3);

Query object

You can use the Query class to create more complex queries.

  1. var query = db.From<User>(); // creates query object
  2. // create query using object
  3. var result = db.Select(query); // executes the query
  4. var result = db.Select<MaxUser>(query); // returning other class (when changing field names)

Joins

  1. var query = db.From<User>().Join<Address>((u, a) => u.Id == a.UserId);
  2. var result = db.Select(query);
  1. var query = db.From<User>()
  2. .LeftJoin<Address>((u, a) => u.Id == a.UserId)
  3. .Where<Address>(a => a.Street.Like("Avenue%"));
  4. var result = db.Select(query);
  1. // note: not supported by SQLite
  2. var query = db.From<User>().RightJoin<Address>((u, a) => u.Id == a.UserId);
  3. var result = db.Select(query);

Group By

  1. var query = db.From<User>().GroupBy(u => u.Name).Count();
  2. var result = db.Select(query);
  1. var query = db.From<User>().GroupBy(u => new { u.Name, u.Age }).Count();
  2. var result = db.Select(query);
  1. var query = db.From<User>().GroupBy(u => u.Name).Having(u => u.Age.Sum() > 100).Count();
  2. var result = db.Select(query);
  1. var query = db.From<User>()
  2. .LeftJoin<Address>((u, a) => u.Id == a.UserId)
  3. .GroupBy(u => u.Name)
  4. .GroupBy<Address>(a => a.Street)
  5. .Having(u => u.Age.Sum() > 100)
  6. .Having<Address>(a => a.Sum.Number.Count() > 2)
  7. .Count();
  8. var result = db.Select(query);

Select Columns

  1. var query = db.From<User>().Select(u => u.Id);
  2. var result = db.Select(query);
  1. var query = db.From<User>().Select(u => new { u.Id, u.Name });
  2. var result = db.Select(query);
  1. var query = db.From<User>().Select(u => new { u.Id, u.Name.Lower().As("Name") });
  2. var result = db.Select(query);
  1. var query = db.From<User>().Join<Address>((u, a) => u.Id == a.UserId)
  2. .Select(u => u.Id).Select<Address>(a => a.Street);
  3. var result = db.Select(query);

Select Exists

  1. var query = database.From<User>().Where(u => u.Id == 1);
  2. bool exists = database.Exists(query);
  1. bool exists = database.Exists<User>(u => u.Id == 1);

Extensions

You can use these extensions to use some SQL methods on your queries.

  1. var query = db.From<User>().Select(u => u.Id.TrimSql());
  2. var result = db.Select(query);
  1. var result = db.Select<User>(u => u.Name.Like("%Test%"));
  1. var query = db.From<User>().GroupBy(u => u.Age.IsNull(0)).Select(u => new { u.Age, u.Name.Length().Min().As("MinName") });
  2. var result = db.Select(query);

All available extensions

  1. Sum()
  2. Min()
  3. Max()
  4. Average()
  5. Count()
  6. Between(start, end)
  7. In(value1, value2, ...)
  8. Like(string)
  9. TrimSql()
  10. Length()
  11. Upper()
  12. Lower()
  13. IsNull(otherValue)
  14. Cast<To>()
  15. As(alias)

Record Maintenance

Insert

  1. db.Insert<User>(new User { Id = 1, Name = "Test User" });

Update

  1. // updates user with Id = 1 with user data
  2. db.Update<User>(user, u => u.Id == 1);

Update Only

  1. // only updates the name of the User with Id = 1
  2. db.UpdateOnly<User>(user, t => t.Name, u => u.Id == 1);

Delete

  1. // delete user with Id = 1
  2. db.Delete<User>(u => u.Id == 1);

Delete By Id

  1. // delete user with Id = 1
  2. db.DeleteById<User>(1);

Delete By Ids

  1. // delete user with Ids 1, 2 and 3
  2. db.DeleteById<User>(1, 2, 3);

Database Schemas

You can use the following methods to create and drop parts of your database:

  1. // databases (does not work for OracleDB)
  2. db.CreateDatabase("test_db");
  3. db.CreateDatabaseIfNotExists("test_db");
  4. db.DatabaseExists("test_db"); // returns true
  5. db.DropDatabaseIfExists("test_db");
  6. db.DropDatabase("test_db");
  7. // tables
  8. db.CreateTable<User>();
  9. db.CreateTables(typeof(User), typeof(Address));
  10. db.CreateTableIfNotExists<User>();
  11. db.CreateTablesIfNotExists(typeof(User), typeof(Address));
  12. db.TableExists<User>(); // returns true
  13. db.DropTable<User>();
  14. db.DropTables(typeof(User), typeof(Address));
  15. db.DropTableIfExists<User>();
  16. db.DropTablesIfExists(typeof(User), typeof(Address));
  17. db.DropAndCreateTable<User>();
  18. db.DropAndCreateTables(typeof(User), typeof(Address));
  19. // columns
  20. db.CreateColumn<User>(t => t.NewColumn);
  21. db.CreateColumnIfNotExists<User>(t => t.NewColumn);
  22. db.ColumnExists<User>("NewColumn"); // returns true
  23. db.ColumnExists<User>(t => t.NewColumn); // returns true
  24. db.DropColumn<User>(t => t.NewColumn);
  25. db.DropColumnIfExists<User>(t => t.NewColumn);
  26. // indexes
  27. db.CreateIndex<User>(t => new { t.Id, t.Name }, true, "IX_User_IdName_Unique");
  28. db.CreateIndexIfNotExists<User>(t => new { t.Id, t.Name }, true, "IX_User_IdName_Unique");
  29. db.IndexExists<User>("IX_User_IdName_Unique"); // returns true
  30. db.IndexExists<User>(t => new { t.Id, t.Name }); // returns true
  31. db.DropIndex<User>("IX_User_IdName_Unique");
  32. db.DropIndexIfExists<User>("IX_User_IdName_Unique");
  33. // foreign keys
  34. db.CreateForeignKey<User, Address>(u => u.Id, a => a.UserId, "FK_User_Address");
  35. db.CreateForeignKeyIfNotExists<User, Address>(u => u.Id, a => a.UserId, "FK_User_Address");
  36. db.ForeignKeyExists<User>("FK_User_Address"); // returns true
  37. db.ForeignKeyExists<User, Address>(u => u.Id, a => a.UserId); // returns true
  38. db.DropForeignKey<User>("FK_User_Address");
  39. db.DropForeignKeyIfExists<User>("FK_User_Address");

For automatic generation and Id usage, the following attributes can be used to decorate your properties.

  1. [Table("USER")] // explicit table name
  2. class User
  3. {
  4. // set as primary key, with the column name, and with AutoIncrement
  5. [Column(isPrimaryKey: true, columnName: "User_ID"), Identity]
  6. public int Id { get; set; }
  7. // create an index when creating the table
  8. [Index]
  9. public string Login { get; set; }
  10. public string Name { get; set; }
  11. // set as nullable
  12. [Column(isRequired: false)]
  13. public DateTime InsertDate { get; set; }
  14. // ignore the field for db
  15. [Ignore]
  16. public float Number { get; set; }
  17. // create a foreign key to Address with the name provided
  18. [Reference(typeof(Address), "FK_User_Address")]
  19. public int AddressId { get; set; }
  20. }

Contributing

All push requests are welcome.

Notes

Aditional usages can be found in the test project.