2013-12-13 18 views
6

Tôi đã tạo một dự án đơn giản bằng cách sử dụng mẫu ASP.Net MVC trong Visual Studion 2013 Express cho Web. Nó không sử dụng bất kỳ xác thực nào. Sau đó, tôi đã cài đặt các gói EntityFramework (v6.0.1), EntityFramework.SqlServerCompact.DbContext không khởi tạo với SQL Server Compact trong ASP.Net MVC

My DbContext lớp là rất đơn giản:

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()); 
    } 
} 

Đối tượng bối cảnh thực tế được tạo ra trong các đơn vị của lớp làm việc:

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); 
     } 
    } 
} 

Chuỗi kết nối được sử dụng là:

<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" /> 

Bây giờ, khi tôi cố gắng truy cập bất kỳ nội dung nào bằng ngữ cảnh này như:

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

Tôi nhận được ngoại lệ sau đây trên rep.GetAll() chức năng:

System.InvalidOperationException: Chuỗi không chứa yếu tố phù hợp

On đào sâu hơn, IQueryable từ lớp Repository (DbSet<EditTest>) được ném ngoại lệ sau đây:

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. 

Tôi nghĩ rằng nó có thể đã gây ra bởi ninject, nhưng nó vẫn còn đó ngay cả sau khi tôi gỡ bỏ nó.

Những gì tôi đang làm sai ở đây hoặc một cái gì đó (một số tham chiếu lắp ráp, vv) bị thiếu?

Trả lời

11

Sau một số tìm kiếm khác về vấn đề này, tôi nhận được this liên kết diễn đàn MSDN. Như đã được đề xuất bởi Rowan, tôi cố gắng để tự khởi tạo bối cảnh sử dụng tuyên bố sau đây trong lớp EFRepository tôi:

dbContext.Database.Initialize(false); 

Các ứng dụng không cách trước khi nó được đánh phương pháp GetAll(). Nhưng điều này tiếp xúc với vết đống đó đã cho tôi một số hướng:

[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 

Sau đó tìm kiếm DbProviderManifestExtensions.GetStoreTypeFromName tiết lộ rằng đây là dòng nơi EF đã cố gắng để có được loại cột. Tôi đã chỉ định UNIQUEIDENTIFIER cho cột Id của tôi:

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

Khi tôi nhận xét điều này, tất cả đều tốt.

Mặc dù có request trên Codeplex để cung cấp thông báo lỗi thích hợp trong trường hợp loại cột không hợp lệ cho nhà cung cấp cơ sở dữ liệu.

+0

bạn hãy lưu tâm trí của mình! Tôi đã phát điên vì điều đó !! – wilver

+0

Tôi có cùng ngoại lệ khi tôi gọi phương thức 'Property (d => d.BTCValue) .HasPrecision (24, 8)' với SQL CE. Cảm ơn bạn đã đưa ra lý do rõ ràng! – Andras

+0

ngày, smalldate và văn bản dường như không phù hợp quá tốt cũng như –

Các vấn đề liên quan