运行以下代码时,我得到以下异常:
实体类型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; }
}