DbContext.set() 无法为实体创建 DbSet,因为此类型未包含在上下文的模型中

Posted

技术标签:

【中文标题】DbContext.set() 无法为实体创建 DbSet,因为此类型未包含在上下文的模型中【英文标题】:DbContext.set() cannot create a DbSet for entity because this type is not included in the model for the context 【发布时间】:2018-10-20 23:03:48 【问题描述】:

我正在使用 EF Core。我正在使用 DbContext.Set() 方法,但它给了我错误 - “无法为 'MediaDate' 创建 DbSet,因为此类型未包含在上下文模型中。'”

下面是我的代码:

var context = new GoldentaurusContext();
DbSet<MediaDate> set = context.Set<MediaDate>();
mediaDateList = set.FromSql("[dbo].[sp_GetMediaDate]")
                .Select(x => new SelectListItem  Text = x.DateText, Value = x.DateValue )
                .ToList();

MediaDate 类:

public class MediaDate

    public string DateText  get; set; 
    public string DateValue  get; set; 

为什么需要我将 MediaDate 类添加到 DbContext 类中?

请帮助我做错了什么?

【问题讨论】:

您是否尝试过另一种在DbContext 外部创建DbSet&lt;T&gt; 实例的方法?使用 Dapper 可能会更好地实现您想要做的事情。 我将执行 SQL 查询和 StoredProcedure,在这两种情况下都会收到相同的错误消息。对此有什么想法吗? @yogihosting - 你能发布你的解决方案吗? @RajuPaladiya 找到任何解决方案了吗?在执行 SQL 查询/存储过程时遇到同样的问题 【参考方案1】:

您的 DB Context 类应如下所示。

 public partial class DatabaseContext : DbContext
   

    public DatabaseContext (string ConnectionString) : base(new DbContextOptionsBuilder().UseSqlServer(ConnectionString).Options)
    

      
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        base.OnModelCreating(modelBuilder);

        modelBuilder.Query<MediaData>();            
    

使用模型构建器在 DatabaseContext 中添加您的模型。 这就是我解决此问题的方法

【讨论】:

Query&lt;&gt; 在 .NET Core 3 中已过时。使用 modelBuilder.Entity&lt;MediaData&gt;().HasNoKey(); 如果必须在 dbcontext 中添加所有模型,泛型集的目的是什么?【参考方案2】:

首先,您应该将模型 (MediaDate) 引入 DbContext。 将 DbSet&lt;MediaDate&gt; 属性添加到您的上下文中:

public class ApplicationDbContext : DbContext

    public ApplicationDbContext()
        : base("DefaultConnection")
    
    

    public DbSet<MediaDate> MediaDates  get; set; 

【讨论】:

没有 set() 使运行时 dbset 看到 ***.com/questions/13710883/…【参考方案3】:

对于 DotNet Core 3.1+ 中的 EF,请确保将您的非表实体添加到您的 DbContext 上的 OnModelCreating 覆盖并在流式 API 上调用 .HasNoKey()。这将允许您使用 DataContext.Set&lt;MediaData&gt;().FromSqlRaw("dbo.MyStoredProc") 调用存储过程并返回您的实体列表。

protected override void OnModelCreating(ModelBuilder modelBuilder)

    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<MediaData>().HasNoKey();

【讨论】:

HasNoKey() 特定于本示例,如果有人想知道,则不需要在不创建表的情况下映射实体。感谢您的回答。 为 Db 集定义 HasNoKey() 解决了这个问题,但是它使 EF 迁移为其生成表创建,这很烦人【参考方案4】:

一个简单的 DatabaseContext 如下所示:

using YourProject.Model;
using System.Data.Entity;

namespace YourProject.Data

    public class DatabaseContext : DbContext
    
        public DatabaseContext() :
            base("name=YourDatabase")
        

        

        public DbSet<MediaData> MediaDates get; set; 
    

您始终需要将模型包含在 DatabaseContext 中以创建 DbSet。确保您声明了正确的命名空间并导入了正确的命名空间。

【讨论】:

为什么我必须将我的 MediaDate 模型添加到 DatabaseContext? Set 的目的是使用任何没有添加到 DatabaseContext 中的模型。??

以上是关于DbContext.set() 无法为实体创建 DbSet,因为此类型未包含在上下文的模型中的主要内容,如果未能解决你的问题,请参考以下文章

如何将动态实体设置为 dbcontext Entity Framework Core?

在 EF 6 / Code First 中按键查找本地缓存的实体

EF执行savechanges失败然后直接返回页面的处理办法

在构造函数中存储DbSet而不是调用DbContext.Set 适合各种用途

使用 DbContext Set<T>() 而不是在上下文中公开

EF中更新操作 ID自增但不是主键 ;根据ViewModel更新实体的部分属性