在非扩展类中使用DbContext



运行以下代码时,我得到以下异常:

实体类型DomainUser不是当前上下文的模型的一部分

using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;
namespace EFTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var dbContext = new DbContext(@"Data Source=...sqlexpress;Initial Catalog=...;Integrated Security=True");
            var entities = dbContext.Set<DomainUser>().ToList();
        }
    }
    [Table("DomainUsers")]
    public class DomainUser
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public bool IsActive { get; set; }
    }
}

更新1

如果我确实指定了查询,它会很好地工作,所以我缺少了什么,以便EF自己生成查询。我来自HNibernate+Fluent背景。

    class Program
    {
        static void Main(string[] args)
        {
            using (var dbContext = new DbContext(@"Data Source=...;Initial Catalog=...;Integrated Security=True"))
        {
                var entities = dbContext.Database.SqlQuery<DomainUser>("select * from DomainUsers;").ToList();
            }
        }
    }
    [Table("DomainUsers")]
    public class DomainUser
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public bool IsActive { get; set; }
    }

更新2

我用下面的代码完成了它,我已经测试过了,问题是,SomeContext类没有提供任何信息,而当我直接使用泛型DbContext时,创建另一个伪类只是为了拥有一些枯燥的属性,这对我来说真的很奇怪。他们无论如何都会做很多类型检查,那么,为什么不只有一个上下文呢?如果Set方法中使用的类型不包含在上下文中,只需进行一些反思并添加它。我仍然觉得奇怪的是,我真的需要一直定义一个上下文,让我们看看其他人怎么说

    class Program
    {
        static void Main(string[] args)
        {
            using (var dbContext = new SomeContext(@"Data Source=...;Initial Catalog=...;Integrated Security=True"))
            {
                var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
                var entities = dbContext.Set<DomainUser>().ToList();
            }
        }
    }
    [Table("DomainUsers")]
    public class DomainUser
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public bool IsActive { get; set; }
    }
    public class SomeContext : DbContext
    {
        public SomeContext(string conn) : base(conn) { }

        public DbSet<DomainUser> DomainUsers { get; set; }
    }

关于发生了什么的任何想法。

您需要向DbContext 添加一个属性

public DbSet<DomainUser> DomainUsers { get; set; }

一旦你做到了,你应该能够做

dbContext.DomainUsers.ToList();

更新

我想说,按照扩展上下文总是最好的做法

public class FunkyContext : DbContext 
{ 
    public DbSet<DomainUser> DomainUsers { get; set; } 
}

最新更新