LiteOrm 将“实体写入”和“视图查询”解耦。你可以直接使用 DAO,也可以通过 Service 封装业务层访问逻辑。
视图模型通常继承实体,并通过 [ForeignColumn] 增加关联字段:
public class UserView : User
{
[ForeignColumn(typeof(Department), Property = "Name")]
public string? DeptName { get; set; }
}
这样查询 UserView 时,LiteOrm 能根据外键关系自动生成 JOIN。
public interface IUserService
: IEntityService<User>, IEntityServiceAsync<User>,
IEntityViewService<User>, IEntityViewServiceAsync<User>
{ }
public class UserService : EntityService<User>, IUserService
{ }
public interface IUserService
: IEntityService<User>, IEntityServiceAsync<User>,
IEntityViewService<UserView>, IEntityViewServiceAsync<UserView>
{ }
public class UserService : EntityService<User, UserView>, IUserService
{ }
| 类型 | 更适合的场景 |
|---|---|
ObjectDAO<T> |
插入、更新、删除、批量写入等实体写操作。 |
ObjectViewDAO<T> |
Search / SearchAs、投影、关联视图读取。 |
EntityService<T> |
业务层封装、事务边界、组合多个 DAO。 |
EntityService<T, TView> |
写入实体与读取视图分离的业务模型。 |
ObjectDAO 与 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);
// 这里可以继续处理角色、审计日志等业务操作
}
}
这里要特别注意:
ObjectDAO<T> 负责实体写操作,本身没有 Search(...) 查询入口。Search(...)、SearchAs(...) 这类查询能力在 ObjectViewDAO<T> 上。ObjectDAO<T> 和 ObjectViewDAO<TView>。TView。ObjectViewDAO<T> 开始。