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<T>
实例的方法?使用 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<>
在 .NET Core 3 中已过时。使用 modelBuilder.Entity<MediaData>().HasNoKey();
如果必须在 dbcontext 中添加所有模型,泛型集的目的是什么?【参考方案2】:
首先,您应该将模型 (MediaDate) 引入 DbContext。
将 DbSet<MediaDate>
属性添加到您的上下文中:
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<MediaData>().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 适合各种用途