7

Tôi có một loạt sự cố khi bật di chuyển (mã đầu tiên) cho cơ sở dữ liệu SQL Server Compact 4.0 của tôi cho ứng dụng .NET trên máy tính để bàn của mình.Máy chủ SQL Mã CE Các sự cố di chuyển đầu tiên

Enable-Migrations không hoạt động và thư mục Migrations được tạo. Sau đó khi tôi cố gắng chạy Add-Migration InitialMigration, tôi nhận được:

Không cho phép truy cập vào tệp cơ sở dữ liệu. [1914, File name = Logo.sdf, SeCreateFile]

Đây là vấn đề đầu tiên, nhưng tôi đã giải quyết nó bằng cách chạy Visual Studio với tư cách quản trị viên ... không thích giải pháp đó và cũng không biết sau đó trong quá trình sản xuất, nó sẽ hoạt động mà không cần ứng dụng đang chạy trong chế độ Quản trị viên. Tôi để vấn đề mà dành cho bây giờ ...

chuỗi kết nối của tôi:

<add name="LogoContext" 
    connectionString="Data Source=Logo.sdf" 
    providerName="System.Data.SqlServerCE.4.0"/>` 

Vì vậy, sau khi chạy Add-Migration InitialMigration trong chế độ quản trị tôi nhận được một di cư rỗng ... đó là ok. Sau đó, tôi xóa di chuyển và thêm một lớp mới:

using System; 
using System.Collections.Generic; 

public class Blog 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
} 

tôi thêm một tham chiếu đến lớp bối cảnh:

public class LogoContext : DbContext 
{ 
    public DbSet<Word> Words { get; set; } 
    public DbSet<User> Users { get; set; } 
    public DbSet<Blog> Blogs { get; set; } 
} 

Sau đó chạy Add-Migration InitialMigration một lần nữa và nhận được:

public partial class InitialMigration : DbMigration 
{ 
    public override void Up() 
    { 
     CreateTable(
      "dbo.Blogs", 
      c => new 
       { 
        ID = c.Int(nullable: false, identity: true), 
        Content = c.String(maxLength: 4000), 
       }) 
      .PrimaryKey(t => t.ID); 
    } 

    public override void Down() 
    { 
     DropTable("dbo.Blogs"); 
    } 
} 

Sau khi chạy Update-Database Tôi thấy:

Applying code-based migrations: [201304211225255_InitialMigration]. 
Applying code-based migration: 201304211225255_InitialMigration. 
Running Seed method. 

Bây giờ vấn đề xuất hiện - trong Server Explorer của tôi, tôi kiểm tra cơ sở dữ liệu Logo.sdf và nó không bao gồm bảng Blogs! Tôi thậm chí còn cố gắng chạy mã này từ ứng dụng của tôi:

var db = new LogoContext(); 
db.Posts.Add(new Blog { Title= "moo" }); 
db.SaveChanges(); 

để kiểm tra xem có lẽ Server Explorer của tôi không hiển thị bàn .. nhưng tôi nhận được một ngoại lệ:

Bảng quy định không hiện hữu. [Blogs]

Vì vậy, các cuộc di cư này rõ ràng là không được áp dụng cho tập tin Logo.sdf tôi :(

Nếu tôi loại bỏ các chuỗi kết nối từ app.config, kết nối đến một trường hợp địa phương của SQL Server Express được giả. Và có nó hoạt động hoàn hảo !! Khi tôi kiểm tra cơ sở dữ liệu với SQL server Management Studio, tôi thấy Blogs bảng mới và cũng là một hệ thống bảng cho siêu dữ liệu về di cư ...

một đôi chút về thông tin:

Khi tôi cố gắng chạy lại Update-Database, tôi nhận được "Không có chuyển đổi dựa trên mã đang chờ xử lý". Điều đó cho tôi biết rằng một số dữ liệu đang được lưu vào Logo.sdf sau tất cả ... ít nhất một số siêu dữ liệu về di chuyển, nhưng tôi vẫn có thể ' t xem bảng đó trong Server Explorer.

Tôi đang sử dụng VS 2012 và EF 5.0.

Hãy giúp tôi hiểu điều này ... Dường như với tôi rằng có điều gì đó nghiêm trọng sai vì nó chỉ hoạt động với SQL Server Express, nhưng không phải với SQL Server CE 4.0. : ((

Cảm ơn bạn david

+2

Đề nghị bạn bắt đầu bằng đường dẫn đầy đủ đến tệp cơ sở dữ liệu trong chuỗi kết nối của bạn, tôi đoán bạn có một vài bản sao của tệp cơ sở dữ liệu, ví dụ trong thư mục bin/debug của bạn – ErikEJ

+0

Hmm Tôi cũng nghĩ về điều này, nhưng tôi "đảm bảo" VS đã truy cập đúng Logo.sdf bằng cách xóa phiên bản bin/Debug ... Tôi chưa bao giờ thử nghiệm nó với đường dẫn tuyệt đối vì tôi đã loại trừ tùy chọn có thể có bản sao thứ ba của tệp db ở đâu đó. .. Và có nó, trong "C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ Logo.sdf" ... ok để bí ẩn được giải quyết - cảm ơn bạn .. Vì vậy, tôi thực sự có thế nào để sử dụng đường dẫn tuyệt đối cho tập tin? Khi tôi biên dịch giải pháp, tệp cấu hình của ứng dụng đã biên dịch cũng chứa đường dẫn tuyệt đối không tốt ...? – davidhq

+0

Sử dụng đường dẫn đầy đủ trong khi phát triển, hoặc khởi tạo tốt hơn ngữ cảnh bằng chuỗi kết nối bạn xây dựng trong mã. – ErikEJ

Trả lời

5

Vì vậy, vấn đề là giải pháp tạo ra một tập tin Sdf riêng biệt ở đây:!

"C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ Logo.sdf"

nào là bất ngờ và IMHO lạ ...

tôi đã kết thúc sử dụng chuỗi kết nối này:

<add name="LogoContext" connectionString="Data Source=|DataDirectory|\Logo.sdf" providerName="System.Data.SqlServerCE.4.0"/> 

Tham chiếu này bin/Debug/Logo.sdf và hoạt động trong khi phát triển và khi chạy riêng biệt .exe.

Điều duy nhất với cách này là tệp dự án Logo.sdf của tôi (đã được sao chép vào Debug "nếu mới hơn") hiện đã bị bỏ qua hoàn toàn. Tất cả các di chuyển sẽ được chạy trên tệp Debug .. Đó có thể là tốt ....

Thanx Erik cho gợi ý! david

+0

Có thể xác nhận điều này hoạt động để gỡ lỗi web với IIS Express. Trong trường hợp của tôi, nó đã cố gắng tạo ra "C: \ Program Files (86) \ IIS Express \ db.sdf" – Jens

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