LiteOrm在线文档

View Models and Services

LiteOrm decouples “entity writes” from “view queries”. You can use DAO directly, or encapsulate business layer access logic through Service.

View Models

View models typically inherit from entities and add association fields via [ForeignColumn]:

public class UserView : User
{
    [ForeignColumn(typeof(Department), Property = "Name")]
    public string? DeptName { get; set; }
}

This way, when querying UserView, LiteOrm can automatically generate JOIN based on foreign key relationships.

Service Definition

Same Entity and View Type

public interface IUserService
    : IEntityService<User>, IEntityServiceAsync<User>,
      IEntityViewService<User>, IEntityViewServiceAsync<User>
{ }

public class UserService : EntityService<User>, IUserService
{ }

Different Entity and View Types

public interface IUserService
    : IEntityService<User>, IEntityServiceAsync<User>,
      IEntityViewService<UserView>, IEntityViewServiceAsync<UserView>
{ }

public class UserService : EntityService<User, UserView>, IUserService
{ }

DAO vs Service Responsibility

Type More Suitable Scenarios
ObjectDAO<T> Entity write operations like insert, update, delete, batch writes.
ObjectViewDAO<T> Search / SearchAs, projections, association view reads.
EntityService<T> Business layer encapsulation, transaction boundaries, combining multiple DAOs.
EntityService<T, TView> Business models where entity write and view read are separated.

Usage Differences Between ObjectDAO and EntityService

public class UserWriteDao : ObjectDAO<User>
{
    public Task<bool> CreateAsync(User user, CancellationToken cancellationToken = default)
    {
        return InsertAsync(user, cancellationToken);
    }
}
using static LiteOrm.Common.Expr;
public class UserViewDao : ObjectViewDAO<UserView>
{
    public Task<List<UserView>> GetActiveUsersAsync(CancellationToken cancellationToken = default)
    {
        return Search(Prop("Age") >= 18).ToListAsync(cancellationToken);
    }
}
public class UserService : EntityService<User>
{
    [Transaction]
    public async Task CreateUserWithDefaultRole(User user)
    {
        await InsertAsync(user);
        // Continue with role, audit log, etc.
    }
}

Important notes here:

When to Use Which