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

yog*_*ing 7 entity-framework-6 entity-framework-core asp.net-core

我正在使用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();
Run Code Online (Sandbox Code Playgroud)

MediaDate 类:

public class MediaDate
{
    public string DateText { get; set; }
    public string DateValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

请帮助我做错了什么?

小智 6

对于 DotNet Core 3.1+ 中的 EF,请确保将非表实体添加到OnModelCreating您的重写中DbContext并调用.HasNoKey()Fluent API。这将允许您使用DataContext.Set<MediaData>().FromSqlRaw("dbo.MyStoredProc")并返回实体列表来调用存储过程。

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

    modelBuilder.Entity<MediaData>().HasNoKey();
}
Run Code Online (Sandbox Code Playgroud)


Sau*_*oot 5

您的 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>();            
    }
Run Code Online (Sandbox Code Playgroud)

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

  • `Query&lt;&gt;` 在 .NET Core 3 中已过时。使用 `modelBuilder.Entity&lt;MediaData&gt;().HasNoKey();` (4认同)
  • 如果必须在 dbcontext 中添加所有模型,那么通用集的目的是什么? (4认同)

小智 1

一个简单的 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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么我必须将 MediaDate 模型添加到 DatabaseContext?Set的目的是使用任何未添加到DatabaseContext的模型。? (4认同)