EF Core调用DbContext.Set()报错:无法为MediaDate创建DbSet,求解决
嘿,我来帮你搞清楚这个问题~
首先,咱们得明白EF Core的DbContext.Set<T>()方法到底要求什么:它只认那些已经在DbContext模型中注册过的类型。EF Core的DbContext就像你和数据库之间的翻译官,它得提前知道哪些类是需要它处理的“实体”,才能正确帮你把数据库的结果映射到代码对象里——哪怕你是调用存储过程返回的自定义结果,它也得认识这个类型才行。
为什么需要把MediaDate添加到DbContext?
EF Core的核心是模型驱动的,它需要明确知道每个实体类型和数据库的映射关系(比如对应哪个表、列名对应哪个属性)。如果你的MediaDate没有被注册到DbContext的模型中,EF Core根本不知道这个类的存在,自然没法为它创建DbSet,也没法解析存储过程返回的结果。
你的操作哪里错了?
你定义了MediaDate类,但没有在GoldentaurusContext中告诉EF Core这个类是它需要管理的类型。这就好比你让翻译官翻译一段文字,但翻译官根本不懂这段文字的语言,肯定会报错。
解决方案
这里有两种常见的解决方式,根据你的场景选就行:
1. 直接在DbContext中添加DbSet属性
如果MediaDate对应数据库中的某个表(或者你只是需要让EF Core识别这个类型),直接在GoldentaurusContext里加一个DbSet:
public class GoldentaurusContext : DbContext { // 你的其他DbSet定义... public DbSet<MediaDate> MediaDates { get; set; } // 上下文的构造函数、OnConfiguring方法等... }
这样EF Core就会自动把MediaDate纳入模型管理了。
2. 用无键实体(Keyless Entity)处理存储过程DTO
如果MediaDate只是存储过程返回的临时结果,并不对应数据库中的任何表,推荐用EF Core的无键实体特性(EF Core 3.0及以上支持):
首先给MediaDate加上[Keyless]特性:
using Microsoft.EntityFrameworkCore; [Keyless] public class MediaDate { public string DateText { get; set; } public string DateValue { get; set; } }
然后在GoldentaurusContext的OnModelCreating方法中配置这个实体:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<MediaDate>().HasNoKey(); // 其他实体配置... }
或者也可以同时添加DbSet属性(方便直接调用):
public DbSet<MediaDate> MediaDates { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<MediaDate>().HasNoKey(); }
额外注意点
调用存储过程的时候,要确保存储过程返回的列名和MediaDate的属性名完全匹配(大小写敏感哦),否则EF Core没法正确映射,你可能会得到空值。
内容的提问来源于stack exchange,提问作者yogihosting

