2011-08-04 36 views
10

Tôi đã hoàn tất việc thử Google cho việc này. Tôi đã cài đặt SQL Server CE 4.0, và có EF 4.1, nhưng tôi không thể có được một chuỗi kết nối thích hợp. Không có gì trên connectionstrings.com áp dụng cho tôi.Chuỗi kết nối để sử dụng SQL Server Compact với Entity Framework?

Tôi chỉ muốn tạo một đối tượng SqlCeEngine, nhưng không có vấn đề gì tôi thử tôi nhận được một số ngoại lệ. Gần đây nhất nó được

tùy chọn kết nối không rõ trong kết nối chuỗi

với một trong hai "siêu dữ liệu", "ứng dụng", "nhà cung cấp", hay "chuỗi kết nối cung cấp dịch vụ" sau khi nó. Tôi biết EF yêu cầu siêu dữ liệu trong chuỗi kết nối. Và tôi không thể tưởng tượng làm thế nào bất cứ điều gì có thể làm mà không có "chuỗi kết nối nhà cung cấp".

Cho đến nay tôi có điều này:

<add name="DBContext" 
    connectionString="provider connection string=&quot;Data Source=MyDbFile.sdf;Persist Security Info=False;&quot;" 
    providerName="System.Data.EntityClient" /> 

Tại một thời điểm tôi đã có nó với siêu dữ liệu:

<add name="DBContext" 
    connectionString="metadata=res://*/Data.DBContext.csdl|res://*/Data.DBContext.ssdl|res://*/Data.DBContext.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=MyDbFile.sdf;Persist Security Info=False;&quot;" 
    providerName="System.Data.EntityClient" /> 

Liệu nó cần siêu dữ liệu hay không? Điều gì xảy ra trong phần "ứng dụng" của chuỗi kết nối? Nhà cung cấp nên là gì, System.Data.SqlClient hoặc một số phiên bản SQL Server CE? (mà tôi vẫn không thể tìm thấy khi tôi cố gắng thêm tài liệu tham khảo. Cửa sổ tham chiếu thêm của tôi vẫn chỉ chứa System.Data.SqlServerCe phiên bản 3.5.1.0.) Hoặc không có gì?

Và điều gì sẽ xảy ra trong thuộc tính providerName? System.Data.EntityClient có đúng không? Nó giống như có 10 biến khác nhau ở đây và mọi kết hợp mang lại cho tôi một lỗi mới không kém bí ẩn, không cái nào trong số đó biến bất kỳ thứ gì hữu ích trên Google. Tôi đã tới giới hạn của mình rồi. Điều này thậm chí có thể?

Trả lời

0

This TechNet article nêu các bước để sử dụng EF với SQL Server Compact. Dòng này nhảy ra khỏi tôi, và có thể giải quyết vấn đề của bạn:

chắc chắn rằng nhà cung cấp = System.Data.SqlServerCe.3.5 trong kết nối chuỗi.

(Tôi sẽ giả định rằng bạn muốn 4.0 thay vì 3.5)

Cho rằng một thử và xem cách mọi thứ đi.

+0

Vẫn mang lại cho tôi một lỗi tùy chọn kết nối không xác định, cho thuộc tính của nhà cung cấp đó. – Tesserex

+0

Bài đăng này (http://erikej.blogspot.com/2010/11/using-entity-framework-with-sql-server.html) cho biết rằng bạn cần thay đổi tệp edmx cũng như tệp cấu hình, nhưng đó là cũng gần một tuổi. Tôi sẽ rất ngạc nhiên nếu sự hỗ trợ của VS cho điều đó đã không được quan tâm, nhưng không có ... –

6

tôi đã bị mắc kẹt với cùng một vấn đề về Entity Framework cách tiếp cận 5.0 Mã đầu tiên với SQL Server Compact Edition 4.0

Để giải quyết nó tôi vượt qua thể hiện của SqlCeConnection-DbContext 's constructor:

public class Storage : DbContext 
{ 
    public Storage() 
     : base(new SqlCeConnection("Data Source=Database.sdf;Persist Security Info=False;"), 
      contextOwnsConnection: true) 
    { } 

    //... 
} 

Nếu bạn không muốn kết nối chuỗi nội tuyến, bạn có thể lấy nó từ App.config qua ConfigurationManager Và tất nhiên bạn nên thêm tham chiếu đến phiên bản đúng của System.Data.SqlServerCe (xem bên trong Extentions trong hộp thoại Thêm tài liệu tham khảo)

0

Giải pháp của Lu55 không hiệu quả đối với tôi, nhưng tôi đã tìm thấy cách để sửa lỗi.Để vẫn sử dụng hệ mã tự động (có thể ghi đè lên những thay đổi trong một tập tin được tạo ra), tôi bổ sung thêm một tập tin với đoạn mã sau:

using System.Data.Entity; 
using System.Data.Objects; 

namespace MyProject.Data 
{ 
    internal partial class Entities : DbContext 
    { 
     public Entities(string connectionString) 
      : base(
       new ObjectContext(
         @"metadata=res://*/Data.Model.csdl| 
            res://*/Data.Model.ssdl| 
            res://*/Data.Model.msl; 
          provider=System.Data.SqlServerCe.4.0;"), 
       true) 
     { 
      Database.Connection.ConnectionString = connectionString; 
     } 
    } 
} 
13

Bạn có thể thử điều này trong file App.config của bạn (EF5 Mã di cư đầu tiên và SQL server CE 4.0):

<connectionStrings> 
    <add name="DefaultConnection" 
     providerName="System.Data.SqlServerCe.4.0" 
     connectionString="Data Source=|DataDirectory|\Data\ProjectDb.sdf"/> 
</connectionStrings> 

và trong bạn ProjectDb lớp:

class ProjectDb : DbContext 
{ 
    public ProjectDb() 
     : base("DefaultConnection") 
    { 

    } 
} 

Nó sẽ làm việc như một nét duyên dáng.

Bạn có thể tìm thêm thông tin tại đây: http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part-2-connections-and-models.aspx

+0

Điều gì về đường dẫn tương đối? Giả sử bạn đang thử nghiệm một db từ một dự án thử nghiệm? Bất kỳ cơ hội nào chúng ta có thể sửa đổi chuỗi kết nối để sử dụng đường dẫn tương đối thay vì nói cơ sở dữ liệu ở đâu? – IbrarMumtaz

+2

Dude, "| DataDirectory | \ Data \ ProjectDb.sdf" là một đường dẫn tương đối –

0

Bạn đã trộn một chút.

Đối với chuỗi SQL kết nối Server CE có thể khá dễ dàng (có thể thay thế DbContext với YourNameSpace.DbContextName):

<add name="DbContext" 
    connectionString="MyDbFile.sdf" 
    providerName="System.Data.SqlServerCe.4.0" /> 

Tôi cũng đã có rất nhiều rắc rối với các kết nối, vì vậy tôi đã điều sau đây:

  • installed Entity Framework for SQL Server CE
  • Kiểm tra xem web.config có chứa nhà cung cấp với bất biến System.Data.SqlServerCe.4.0
  • đã xác minh rằng không có lĩnh vực chuỗi (mà sẽ được biểu diễn dưới dạng cột trong db) với chiều dài tối đa hay chế độ hơn 4000 ký tự (để thêm hạn chế sử dụng chú thích [MaxLength(4000)], theo mặc định == MAX)

Metadata là cần thiết khi bạn sử dụng mô hình cơ sở dữ liệu đầu tiên thay vì mã đầu tiên, do đó, có .edmx tệp đại diện cho mô hình được tạo ra của cơ sở dữ liệu.

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