在非扩展类中使用DbContext

时间:2015-11-03 12:39:42

标签: c# entity-framework

我在运行以下代码时遇到以下异常:

实体类型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; }
    }
}

UPDATE1

如果我确实指定了查询,它可以正常工作,所以我缺少了什么,以便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

我使用了我已经测试过的代码,事实是,当我直接使用泛型DbContext时,SomeContext类没有提供任何我无法提供的信息。创建另一个虚拟类只是为了拥有一些沉闷的属性对我来说真的很奇怪。无论如何,它们会进行大量的类型检查,所以为什么不只有一个上下文,如果在上下文中没有包含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; }
    }

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

1 个答案:

答案 0 :(得分:1)

您需要向DbContext添加属性

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

完成后你应该可以做到

dbContext.DomainUsers.ToList();

更新

我认为最好的做法是扩展上下文,如下所示

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