為什麼選擇 XPO?
- DevExpress 出品,Visual Studio 深度集成
- 無 XML 映射文件,特性驅動映射
- 自動建表、遷移、連接池管理
- LINQ 查詢原生支持,Criteria API 強大
領域模型定義
[Persistent("Users")]
public class User : XPObject {
public User(Session session) : base(session) { }
string _accountName, _realName, _userPwd = "U";
[Size(50)] public string AccountName { get => _accountName; set => SetPropertyValue(nameof(AccountName), ref _accountName, value); }
[Size(50)] public string RealName { get => _realName; set => SetPropertyValue(nameof(RealName), ref _realName, value); }
[Size(100)] public string UserPwd { get => _userPwd; set => SetPropertyValue(nameof(UserPwd), ref _userPwd, value); }
[Association("User-Details")]
public XPCollection Details => GetCollection(nameof(Details));
}
[Persistent("UserDetails")]
public class UserDetail : XPObject {
public UserDetail(Session session) : base(session) { }
string _accountName, _address;
[Size(50)] public string AccountName { get => _accountName; set => SetPropertyValue(nameof(AccountName), ref _accountName, value); }
[Size(200)] public string Address { get => _address; set => SetPropertyValue(nameof(Address), ref _address, value); }
[Association("User-Details")]
public User User { get; set; } // 反向導航
}
核心操作模式
新增(含關聯)
using (var uow = new UnitOfWork()) {
var user = new User(uow) { AccountName = "zhangsan", RealName = "張三" };
user.Details.Add(new UserDetail(uow) { Address = "北京市朝陽區" });
user.Details.Add(new UserDetail(uow) { Address = "上海市浦東區" });
uow.CommitChanges(); // 事務提交
}
查詢(LINQ + Criteria)
// LINQ
var users = from u in session.Query()
where u.AccountName.StartsWith("zhang")
select u;
// Criteria 複雜條件
var criteria = CriteriaOperator.Parse("AccountName LIKE 'zhang%' AND Details[].Address CONTAINS '北京'");
var users = session.GetObjects(criteria);
修改與刪除
// 修改
user.RealName = "李四"; uow.CommitChanges();
// 刪除(級聯由 Association 控制)
uow.Delete(user); uow.CommitChanges();
Session/UnitOfWork 最佳實踐
- Web 請求範圍:
HttpContext.Current.Items["XpoSession"] 單例
- 後台任務:
using (var uow = new UnitOfWork()) 短生命周期
- 避免長 Session 持有鎖,及時
CommitChanges() 或 Rollback()