Skip to content
Squil11ams edited this page Jul 16, 2026 · 7 revisions

MerlinXX-ORM

https://github.com/Squil11ams/MerlinXX-ORM

This is a simple ORM that can auto populate data models with data from a database.

Basic Setup

There are two steps required to use this ORM.

Step 1 - Model See MerlinModelBase for more details on how the model system works.

In your model setup your fields to match the columns and datatype of the database and extend your model with MerlinObjectBase.

Its a little long winded but this shows how you can structure your models and data access to make a clean and simple api.

public enum StatusEnum
{
    NA,
    Active,
    Inactive,
}

public class UserDetail : UserEntity
{
    [MerlinObject]
    public ClientEntity Client { get; set; }

    [Exclude]
    public List<UserPerm> Permissions { get; set; }
}

public class UserEntity : MerlinModelBase
{
    public int user_id { get; set; }

    public string user_first { get; set; }

    public string user_last { get; set; }

    public string user_email { get; set; }

    [MerlinObject("user_h_")]
    public AddressEntity HomeAddress { get; set; }

    [MerlinObject("user_w_")]
    public AddressEntity WorkAddress { get; set; }

    public StatusEnum user_status { get; set; }
  
    public int user_client { get; set; }
}

public class ClientEntity: MerlinModelBase
{
    public int client_id { get; set; }

    public string client_name { get; set; }

    [MerlinObject("client_")]
    public AddressEntity WorkAddress { get; set; }

    public string client_email { get; set; }

    public StatusEnum client_status { get; set; }
}

public class AddressEntity: MerlinModelBase
{
      [AutoPopSettings("addr_1")]
      public string Address1 { get; set; }

      [AutoPopSettings("addr_2")]
      public string Address2 { get; set; }

      [AutoPopSettings("city")]
      public string City { get; set; }

      [AutoPopSettings("state")]
      public string State { get; set; }

      [AutoPopSettings("zip")]
      public string Zip { get; set; }
}

public class UserPermission: MerlinModelBase
{
      public string perm_id { get; set; }

      public string perm_user { get; set; }

      public string perm_type { get; set; }
}

Step 2 - Query the Database

class UserDataAccess
{
    private static readonly QueryEngine DB = new("Default");

    public static UserEntity GetUser(int userID)
    {
        var query = new GenericQuery("SELECT * FROM users WHERE user_id = @A;");

        query.AddParameter("@A", userID);

        return DB.GetObject<UserEntity>(query);
    }

    public static List<UserEntity> GetUsers()
    {
        var query = new GenericQuery("SELECT * FROM users;");

        query.AddParameter("@A", userID);

        return DB.GetObject<UserEntity>(query);
    }

    public static UserDetail GetFullUser(int userId)
    {
        var query = new GenericQuery("SELECT * FROM view_users_clients WHERE user_id = @A;");

        query.AddParameter("@A", userID);

        user = DB.GetObject<UserDetail >(query);

        user.Permissions = GetUserPermissions(userId);

        return user;
    }

    public static List<UserPermission> GetUserPermissions(int userId)
    {
        var query = new GenericQuery("SELECT * FROM user_perms WHERE perm_user = @A;");

        query.AddParameter("@A", userID);

        user = DB.GetObject<UserPermission>(query);
    }
}

Clone this wiki locally