2010-11-16 34 views
19

Có ai biết về DB tốt trong bộ nhớ hoạt động tốt với .NET 4/EF 4 không? Cụ thể, tôi đang nghĩ về kiểm thử đơn vị, sao cho mỗi thiết lập có thể dễ dàng tạo DB, và điền nó với các giá trị mặc định, và mỗi teardown có thể phá hủy nó - một cách nhanh chóng.DB trong bộ nhớ cho khung thực thể 4

Tôi đã nghe nói rằng SQLite doesn't support .NET 4 chưa, và những người khác đã gặp sự cố khi sử dụng nó làm thay thế cho SQLServer (đó là những gì ứng dụng sẽ chạy trong chế độ phát hành).

Trước đây, tôi đã sử dụng DevExpress XPO ORM và có cơ sở dữ liệu trong bộ nhớ tích hợp hoạt động khá tốt để kiểm tra đơn vị.

+1

thể trùng lặp của [Testing EF SQL Server ứng dụng dựa với SQLite trong bộ nhớ ?] (http://stackoverflow.com/questions/2372030/testing-ef-sql-server-based-application-with-in-memory-sqlite) –

+1

@Craig Stuntz - Tôi không tìm cách giả lập kho của tôi, mà tôi có thể làm bây giờ mà không gặp rắc rối, tôi đang tìm cách thay thế một DB trong bộ nhớ cho một thực tế ... để tôi có thể không chỉ kiểm tra các dịch vụ mà tôi có thể kiểm tra mã tạo ra các bảng DB và chèn mặc định dữ liệu vào DB. –

+1

Đối với những người đang đọc câu hỏi này, SQLite hiện hỗ trợ .NET 4 và .NET 4.5 qua trang web này: http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki –

Trả lời

2

SQL CE sẽ thực hiện việc này cho bạn. Nó là một cơ sở dữ liệu nhúng chạy trong tiến trình. Nó hoạt động với EF4 (bao gồm Mã đầu tiên). Cách dễ nhất để có được nó là cài đặt trực tiếp gói NuGet cho nó. Có hai gói NuGet - một gói chỉ có SQL CE và một gói khác có SQL CE hoạt động với EF Code First CTP4.

+1

SQL CE không thể làm việc trong bộ nhớ, mặc dù, có thể nó? – Gabe

+0

Vâng, đúng vậy. Hãy xem bài đăng này của Scott Gu: http://weblogs.asp.net/scottgu/archive/2010/06/30/new-embedded-database-support-with-asp-net.aspx. Chìa khóa ở đây từ bài viết đó là phần này: "Công cụ cơ sở dữ liệu SQL CE sau đó chạy trong bộ nhớ trong ứng dụng của bạn. Khi ứng dụng của bạn tắt cơ sở dữ liệu sẽ tự động được nạp." –

+0

Không hoàn toàn đúng, tôi đã thử nghiệm lưu trữ một CE db trên một đĩa ram, và có khoảng 50% cải thiện tốc độ truy vấn. CE vẫn có xu hướng nhấn hệ thống tập tin khó hơn (và những gì tôi mong đợi). – leppie

1

Nếu nó không phải là một vấn đề đối với bạn để chuyển sang EF CTP4 sau đó nó như thế:

EF4 CTP4 SQL CE 4 CTP

Nó sẽ tạo db trong bộ nhớ cho bạn khi bạn viết bài kiểm tra đơn vị (mã đầu tiên).

7

Bạn sẽ thử nghiệm đơn vị với CE4 nếu mô hình của bạn có khóa được tạo cơ sở dữ liệu (thường được chỉ rõ trong EF4 bằng chú thích [DatabaseGenerated (DatabaseGeneratedOption.Identity)], vì CE4 không hỗ trợ điều này.

Nhưng tôi đã tìm thấy cách giải quyết dễ dàng mà không cần phải sửa đổi mã sản xuất của mình (chạy trên SQL 2008). Tôi tạo ra một proxy sub-class của DbContext của tôi, và trong đó overrode OnModelCreating để loại bỏ các chú thích, và gạt SaveChanges để thiết lập ID bằng tay:

public class TestContext : MyDbContext 
{ 
    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) 
    { 
    modelBuilder.Entity<MyEntity>().Property(e => e.Id) 
     .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

    base.OnModelCreating(modelBuilder); 
    } 

    public override int SaveChanges() 
    { 
    foreach (var entry in ChangeTracker.Entries<MyEntity>().Where(e => e.State == EntityState.Added)) 
    { 
     entry.Entity.Id = Guid.NewGuid(); 
    } 
    return base.SaveChanges(); 
    } 
} 

Với những tinh chỉnh nhỏ, tôi có thể bây giờ đơn vị kiểm tra kho cùng mã trong CE4 chạy trong SQL 2008 trong sản xuất.

Và nếu bạn đang sử dụng ID số nguyên chứ không phải là GUID, có một phương pháp khuyến nông tốt đẹp ở đây có thể được cắm ngay vào giải pháp trên: http://enigmadomain.wordpress.com/2010/01/06/sql-compact-identity-columns-and-entity-framework/

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