gpt4 book ai didi

c# - Entity Framework RC1 DbContext 查询问题

转载 作者:行者123 更新时间:2023-11-30 21:16:13 26 4
gpt4 key购买 nike

我正在尝试首先使用实体​​框架代码 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 数据库并以这种方式查询数据。 var context2 中的连接字符串是在更新 PlssContext 对象后从上下文中获取的。所以他们指向同一个 sqlexpress 数据库。

第一个查询有效。第二个查询因这个错误而惨败:

The model backing the 'DbContext' context has changed since the database was created. Either manually delete/update the database, or call Database.SetInitializer with an IDatabaseInitializer instance. For example, the DropCreateDatabaseIfModelChanges strategy will automatically delete and recreate the database, and optionally seed it with new data.

在这条线上

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)
{

我已经尝试了所有的 Initializer 策略,但都出现了同样的错误。我不认为数据库正在改变。如果我删除

     modelBuilder.Conventions.Remove<IncludeMetadataConvention>();

那么错误返回就是

The entity type User is not part of the model for the current context.

哪一种是有道理的。但是,如何将所有这些整合在一起呢?

最佳答案

这是正确的行为。 Plain DbContext 不知道映射(= 不知道您的任何实体)。这就是为什么您应该始终创建派生上下文的原因。您的存储库不知道 PlssContext 但您仍然可以像这样注入(inject)它:

public class Repository
{
private readonly DbContext _context;

public Repository(DbContext context)
{
_context = context;
}
...
}

var repository = new Repository(new PlssContext());

在先使用代码时,不能直接使用基础 DbContext 实例。

关于c# - Entity Framework RC1 DbContext 查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5333847/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com