2013-12-13 39 views
6

我在Visual Studion 2013 Express for Web中使用ASP.Net MVC模板創建了一個簡單的項目。它不使用任何身份驗證。然後我安裝了EntityFramework(v6.0.1),EntityFramework.SqlServerCompact包。DbContext不使用ASP.Net中的SQL Server Compact進行初始化MVC

我的DbContext類很簡單:

public class EditTestContext : DbContext 
{ 
    public EditTestContext() : base("EditTestContext") 
    { 
    } 

    public EditTestContext(string connectionString) : base(connectionString) 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     Database.SetInitializer(
         new DropCreateDatabaseIfModelChanges<EditTestContext>()); 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

     modelBuilder.Configurations.Add(new EditTestConfig()); 
    } 
} 

實際的上下文對象在工作類的單位創建:

public class EditTestUoW:IEditTestUoW,IDisposable 
{ 
    private DbContext dbContext; 

    public EditTestUoW() 
    { 
     CreateDbContext(); 
    } 

    private void CreateDbContext() 
    { 
     dbContext = new EditTestContext();//NEW DBCONTEXT OBJECT IS CREATED 
     dbContext.Configuration.LazyLoadingEnabled = false; 
     dbContext.Configuration.ProxyCreationEnabled = false; 
     dbContext.Configuration.ValidateOnSaveEnabled = false; 
    } 

    public IRepository<EditTestModel> EditTestRepo 
    { 
     get 
     { 
      return new EFRepository<EditTestModel>(dbContext); 
     } 
    } 
} 

正在使用的連接字符串是:

<add name="EditTestContext" connectionString="Data Source= 
    |DataDirectory|EditTestDb.sdf;Max Database Size=256; 
    Max Buffer Size=1024;File Mode=Shared Read; 
    Persist Security Info=False;" providerName="System.Data.SqlServerCe.4.0" /> 

現在,當我嘗試使用此上下文訪問任何內容時,如:

var rep=UoW.EditTestRepo; 
var list=rep.GetAll().ToList(); 

我得到以下異常對rep.GetAll()功能:

System.InvalidOperationException:序列不包含任何匹配的元素

在從倉庫類更深的挖掘,IQueryableDbSet<EditTest>)拋出以下異常:

The context cannot be used while the model is being created. This exception may 
be thrown if the context is used inside the OnModelCreating method or if the same 
context instance is accessed by multiple threads concurrently. Note that instance 
members of DbContext and related classes are not guaranteed to be thread safe. 

我以爲這可能是由造成的10,但即使在我將其移除後它仍然存在。

我在這裏做錯了什麼(某些程序集引用等)丟失?

回答

11

那麼經過一些其他的搜索問題,我得到this MSDN論壇鏈接。由於是由羅文建議,我試圖手動初始化使用下面的語句上下文在我EFRepository類:

dbContext.Database.Initialize(false); 

應用程序未能方式,被擊中的GetAll()方法之前。但是,這其中暴露給了我一些方向上的堆棧跟蹤:

[InvalidOperationException: Sequence contains no matching element] 
    System.Linq.Enumerable.Single(IEnumerable`1 source, Func`2 predicate) +2614017 
    System.Data.Entity.Utilities.DbProviderManifestExtensions.GetStoreTypeFromName 
         (DbProviderManifest providerManifest, String name) +146 
    .....Other Lines..... 
    System.Data.Entity.Internal.InternalContext.Initialize() +31 
    System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType 
                  (Type entityType) +38 
    System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() +138 
    System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext() +38 
    System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable 
         .get_Provider() +99 
    System.Linq.Queryable.Any(IQueryable`1 source) +50 

然後搜索DbProviderManifestExtensions.GetStoreTypeFromName透露,這是在EF試圖讓列類型的線。我已經指定UNIQUEIDENTIFIER我的ID列:

Property(x=> x.Id).HasColumnType("UNIQUEIDENTIFIER") 

一旦我評論這一點,一切都很好。

儘管在上有一個request Codeplex在列類型對數據庫提供者無效時提供適​​當的錯誤消息。

+0

你救我的腦海!我爲此瘋狂了! – wilver

+0

當我使用SQL CE調用'Property(d => d.BTCValue).HasPrecision(24,8)'方法時,我遇到了同樣的異常。感謝您澄清原因! – Andras

+0

date,smalldate和文字似乎不太適合 –