2

我試圖實現使用實體框架代碼RC第一1.我遇到了與創造的DbContext問題庫模式。我有一個IoC容器解決IRepository,它有一個contextprovider剛剛新聞了一個windsor.config文件的連接字符串的新的DbContext。用linq2sql這個部分沒有問題,但EF看起來很嗆。我將用一個例子來描述下面的問題。我已經拿出代碼來簡化一些事情,所以這就是爲什麼你在這裏沒有看到任何存儲庫模式的東西。只是在沒有所有額外代碼和類的情況下進行排序。實體框架RC1的DbContext查詢問題

  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數據庫。

第一查詢工作。第二個查詢,此錯誤悲慘的失敗了:

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

我已經嘗試了所有初始化策略與同樣的錯誤。我不認爲數據庫正在改變。如果我刪除

 modelBuilder.Conventions.Remove<IncludeMetadataConvention>(); 

然後錯誤再次是

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

哪種類型的有道理。但是,你如何將這一切結合起來?

回答

4

這是正確的行爲。平原DbContext沒有關於映射想法(=不知道您的任何實體)。這就是爲什麼你應該總是創建派生上下文的原因。您的倉庫不知道PlssContext但你仍然可以把它注射想:

public class Repository 
{ 
    private readonly DbContext _context; 

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

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

首先使用的代碼時,不能直接使用基地DbContext實例。

+0

會,如果我不使用代碼第一種方法使用連接字符串的工作?數據庫get的創建後,我仍然無法使用連接字符串來執行我想要的DbContext? – Steve 2011-03-17 16:10:09

+0

這不是關於連接字符串。它關於上下文的配置,配置由派生類而不是基類定義。你必須使用'PlssContext'。 – 2011-03-17 16:14:03

+0

我將不得不考慮使用windsor來傳遞上下文的方式。我想我可以將它添加爲一個組件。我不喜歡你如何在你的例子中硬編碼。 – Steve 2011-03-17 16:22:34