EntityFrameworkCore Boot Kit (EFBK) is a quick start database connect library for using .NET EntityFrameworkCore.
- Inherits from EntityFrameworkCore Triggers to enable entries update notfication.
- Support mulitple databases like MySql, SQL Server, Sqlite, PostgreSql, MongoDB, Amazon Redshift, AWS Aurora and InMemory.
- Support dynamic linq to query and update database.
- Support read/write seperated mode. Randomly choose multiple slaves.
- Multiple database with distributed transaction supported, and MySQL multiple databases/tables sharding supported.
- Tracking entry change history.
- Built-in DbFactory with access control list (ACL) hook.
How to install
PM> Install-Package EntityFrameworkCore.BootKit
How to use
- Define entity
public class PizzaOrder : DbRecord, IDbRecord
{
[MaxLength(32)]
public String OrderNumber { get; set; }
[MaxLength(64)]
public String CustomerName { get; set; }
[Required]
public DateTime CreatedTime { get; set; }
[ForeignKey("OrderId")]
public List<PizzaType> PizzaTypes { get; set; }
}
- Init data context
var db = new Database();
AppDomain.CurrentDomain.SetData("Assemblies", new string[] { "EntityFrameworkCore.BootKit.UnitTest" });
// bind as much data context as you can
db.BindDbContext<IDbRecord, DbContext4Sqlite>(new DatabaseBind
{
MasterConnection = new SqliteConnection($"Data Source={Directory.GetCurrentDirectory()}\\..\\..\\..\\..\\bootkit.db"),
CreateDbIfNotExist = true
});
db.BindDbContext<IDbRecord, DbContext4PostgreSql>(new DatabaseBind
{
MasterConnection = new NpgsqlConnection("Server=; Port=5439;User ID=;Password=;Database=;SSL Mode=Require;Trust Server Certificate=True;Use SSL Stream=True"),
});
- Retrieve record
var order = db.Table<PizzaOrder>().Include(x => x.PizzaTypes).FirstOrDefault();
- Retrieve record by table name
var table = db.Table("PizzaOrder");
var pizzaOrder = table.First() as PizzaOrder;
- Update record in transaction
int row = db.DbTran(() =>
{
var po = db.Table<PizzaOrder>().Find(PIZZA_ORDER_ID);
po.CreatedTime = DateTime.UtcNow
});
- Update record in Patch function
int row = db.DbTran(() =>
{
var patch = new DbPatchModel
{
Table = "PizzaOrder",
Id = PIZZA_ORDER_ID
};
patch.Values.Add("CreatedTime", dt);
db.Patch<IDbRecord>(patch);
});
- Implement IRequireDbPermission to interupt update
- View raw sql
string sql = table.ToSql();
- Added MongoDb support
db.BindDbContext<IDbRecord, DbContext4MongoDb>(new DatabaseBind
{
MasterConnection = new MongoDbConnection("mongodb://user:password@localhost:27017/db"),
});
var collection = db.Collection<MongoDbCollectionTest>().FirstOrDefault();
// Add new record
db.Collection<MongoDbCollection>().InsertOne(new MongoDbCollection
{
Id = Guid.NewGuid().ToString(),
Name = "Pizza"
});
// Update record
db.Collection<MongoDbCollection>().UpdateOne(x => x.Name == "Pizza", x => x.Name, "Pizza 2");
- Support Amazon Redshift
db.BindDbContext<IDbRecord, DbContext4Redshift>(new DatabaseBind
{
string connString = "Server=*.us-east-1.redshift.amazonaws.com; Port=5439;User ID=;Password=;Database=;Server Compatibility Mode=Redshift;SSL Mode=Require;Trust Server Certificate=True;Use SSL Stream=True";
MasterConnection = new NpgsqlConnection(connString),
});