Breeze.sharp能否支持无键实体?只读场景下如何配置?
解决Breeze处理无主键视图的只读场景问题
方法1:给视图生成虚拟主键
直接在查询视图时,用现有字段拼接或数据库行号生成一个唯一标识当作虚拟主键,比如:
SELECT CONCAT(ColumnA, '_', ColumnB) AS Id, -- 用唯一组合字段生成主键 ColumnA, ColumnB, -- 其他需要的字段 FROM YourView
接着在Breeze的实体模型里,把这个Id字段标记为主键就行。只读场景下完全不用担心主键的更新问题,Breeze会正常识别处理。
方法2:禁用Breeze的实体追踪
既然是只读场景,没必要让Breeze把视图数据当成可追踪实体处理,直接按普通DTO来返回:
- 服务器端:查询时返回匿名类或自定义DTO集合,而非Breeze的
IQueryable<实体类>,示例(C#):[HttpGet] public IEnumerable<ViewDto> GetViewData() { return _context.YourView .Select(v => new ViewDto { ColA = v.ColumnA, ColB = v.ColumnB // 映射其他字段 }) .ToList(); } - 客户端:用
executeQuery获取数据后,直接使用结果,不要把数据加入Breeze实体管理器的缓存,示例(JS):const query = breeze.EntityQuery.from("YourView"); manager.executeQuery(query) .then(data => { // 直接渲染表格,不调用addEntities等缓存方法 renderTable(data.results); });
方法3:手动标记唯一字段为主键
如果不想改查询语句,就选视图里一个实际唯一的字段(哪怕不是数据库主键),在Breeze模型配置里标记为主键,示例(C#):
modelBuilder.Entity<YourViewEntity>() .HasKey(e => e.ColumnA); // 选择视图中唯一的字段当作主键
只要这个字段在视图数据里不重复,Breeze就不会再报主键缺失的错误,只读场景下完全够用。
内容的提问来源于stack exchange,提问作者justinm-4tech
相关产品推荐
相关产品推荐

