我试图先使用实体框架代码rc 1实现存储库模式。我遇到的问题是创建DbContext。我有一个解析IRepository的ioc容器,它有一个contextprovider,它用windsor.config文件中的连接字符串来通知一个新的DbContext。使用linq2sql,这部分没问题,但是EF似乎令人窒息。我将在下面用示例描述问题。我已经拉出代码来简化一些事情,所以这就是为什么您在这里看不到任何存储库模式的原因。只是在没有所有额外代码和类的情况下发生了什么。
using (var context = new PlssContext())
{
var x = context.Set<User>();
var y = x.Where(u => u.UserName == LogOnModel.UserName).FirstOrDefault();
}
using (var context2 = new DbContext(@"Data Source=.\SQLEXPRESS;Initial Catalog=PLSS.Models.PlssContext;Integrated Security=True;MultipleActiveResultSets=True"))
{
var x = context2.Set<User>();
var y = x.Where(u => u.UserName == LogOnModel.UserName).FirstOrDefault();
}
PlssContext是我创建DbContext类的地方。存储库模式对PlssContext一无所知。我认为我能做的最好的事情就是创建一个DbContext,它带有到sqlexpress数据库的连接字符串,并以此方式查询数据。在更新PlssContext对象之后,从上下文中获取了var context2中的连接字符串。因此,他们指向的是相同的sqlexpress数据库。
第一个查询有效。第二个查询因以下错误而失败:
支持“ DbContext”的模型
自数据库以来上下文已更改
已创建。手动
删除/更新数据库,或调用
Database.SetInitializer与
IDatabaseInitializer实例。对于
例如,
DropCreateDatabaseIfModelChanges
策略将自动删除并
重新创建数据库,并且可以选择
用新数据播种。
在这条线上
var y = x.Where(u => u.UserName == LogOnModel.UserName).FirstOrDefault();
这是我的DbContext
namespace PLSS.Models
{
public class PlssContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Corner> Corners { get; set; }
public DbSet<Lookup_County> Lookup_County { get; set; }
public DbSet<Lookup_Accuracy> Lookup_Accuracy { get; set; }
public DbSet<Lookup_MonumentStatus> Lookup_MonumentStatus { get; set; }
public DbSet<Lookup_CoordinateSystem> Lookup_CoordinateSystem { get; set; }
public class Initializer : DropCreateDatabaseAlways<PlssContext>
{
protected override void Seed(PlssContext context)
{
我已经尝试了所有带有相同错误的初始化策略。我认为数据库没有变化。如果我删除
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
然后错误返回是
实体类型用户不是当前上下文模型的一部分。
哪种有意义。但是如何将所有这些结合在一起?
最佳答案
那是正确的行为。 Plain DbContext
不了解映射(=不知道您的任何实体)。这就是为什么您应该始终创建派生上下文的原因。您的存储库不了解PlssContext
,但是您仍然可以像这样注入它:
public class Repository
{
private readonly DbContext _context;
public Repository(DbContext context)
{
_context = context;
}
...
}
var repository = new Repository(new PlssContext());
首先使用代码时,不能直接使用基本
DbContext
实例。