Blazor(.NET Core7)中如何显示Server Type而非Server Type Id
解决方案:关联ServerNames与ServerTypes获取服务器类型名称
错误原因说明
你遇到的server names doesn't contain definition for ServerType错误,主要是因为ServerNames实体类未配置与ServerTypes的导航属性,或是LINQ查询的关联写法有误。
1. 确认实体类与DbContext配置
先确保实体类结构正确,可选配置导航属性简化后续查询:
// ServerNames实体类 public class ServerNames { public int ServerId { get; set; } public string ServerName { get; set; } public int ServerTypeId { get; set; } // 可选:添加与ServerTypes的导航属性 public ServerTypes ServerType { get; set; } } // ServerTypes实体类 public class ServerTypes { public int ServerTypeId { get; set; } public string ServerTypeName { get; set; } }
在DbContext中配置外键关联(若未自动识别):
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<ServerNames>() .HasOne(sn => sn.ServerType) .WithMany() .HasForeignKey(sn => sn.ServerTypeId); }
2. 修改GetAll()方法的两种实现方式
首先创建一个ViewModel用于封装返回结果(避免直接返回实体类):
public class ServerViewModel { public int ServerId { get; set; } public string ServerName { get; set; } public string ServerTypeName { get; set; } }
方式一:利用EF导航属性(推荐)
通过Include加载关联数据,再通过Select映射到ViewModel:
public async Task<List<ServerViewModel>> GetAll() { return await _context.ServerNames .Include(sn => sn.ServerType) // 加载关联的ServerTypes数据 .Select(sn => new ServerViewModel { ServerId = sn.ServerId, ServerName = sn.ServerName, ServerTypeName = sn.ServerType.ServerTypeName }) .ToListAsync(); }
方式二:手动LINQ Join关联(无需导航属性)
直接通过ServerTypeId字段关联两个表:
public async Task<List<ServerViewModel>> GetAll() { var query = from sn in _context.ServerNames join st in _context.ServerTypes on sn.ServerTypeId equals st.ServerTypeId select new ServerViewModel { ServerId = sn.ServerId, ServerName = sn.ServerName, ServerTypeName = st.ServerTypeName }; return await query.ToListAsync(); }
3. 额外排查点
- 检查LINQ语句中是否误将
ServerTypeName的来源指向ServerNames类(需从关联的ServerTypes表获取) - 确认数据库中
servernames表的ServerTypeId与servertypes表的ServerTypeId字段类型一致,且存在匹配的关联数据
内容的提问来源于stack exchange,提问作者ahmed abdelaziz
相关产品推荐
相关产品推荐

