10

Tôi đang sử dụng EF 4.1 và tôi tạo tệp EF edmx bình thường. Tôi tạo từ DB.Entity Framework không thể sử dụng DbContext, mô hình đang được tạo

Khi được tạo, tôi nhấp chuột phải và chọn thêm mục tạo mã, để tạo các lớp mới và sử dụng DbContext thay thế. Tôi sử dụng trình tạo mẫu DbContext.

Mọi thứ hoạt động tốt.

Sau đó, tôi Trie để truy vấn bối cảnh:

using (var context = new PasDBEntities()) 
{ 
    var client=context.ClientCompanies.SingleOrDefault(_=>_.ID==clientCompanyId); 
    if(client!=null) 

Tôi không có vấn đề tạo ra một thể hiện mới của bối cảnh nhưng khi tôi cố gắng để truy vấn nó trở thành vấn đề xảy ra. Tôi bị kẹt trên UnintentionalCodeFirstException. Và nhận được lỗi:

{"Code generated using the T4 templates for Database First and Model First development may not work correctly if used in Code First mode. To continue using Database First or Model First ensure that the Entity Framework connection string is specified in the config file of executing application. To use these classes, that were generated from Database First or Model First, with Code First add any additional configuration using attributes or the DbModelBuilder API and then remove the code that throws this exception."}

Tôi không muốn sử dụng mã đầu tiên, nhưng tôi không biết nếu tôi có thể "chuyển" nó đi, hoặc nơi mà vấn đề là.

Để tham khảo, đây là nhà xây dựng của tôi ...

public partial class PasDBEntities : DbContext 
{ 
    public PasDBEntities() 
     : base("PasDBEntities") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 

... và chuỗi kết nối:

<connectionStrings> 
    <add name="PasDBEntities" 
     connectionString="metadata=res://*/PasDB.csdl| 
            res://*/PasDB.ssdl| 
            res://*/PasDB.msl; 
          provider=System.Data.SqlClient; 
          provider connection string=&quot; 
          data source=localhost; 
          initial catalog=PasDB; 
          integrated security=True; 
          pooling=False; 
          multipleactiveresultsets=True; 
          App=EntityFramework&quot;" 
     providerName="System.Data.EntityClient" /> 
</connectionStrings> 
+6

là chuỗi kết nối này trong "tập tin cấu hình của ** thực hiện ứng dụng **" (trích dẫn ngoại lệ) và không chỉ trong một tập tin cấu hình của một dự án thư viện? – Slauma

+1

Bạn đúng vậy. Tôi không biết rằng tôi đã phải thêm một tập tin cấu hình thêm cho chuỗi kết nối trong dự án thử nghiệm đơn vị của tôi để có thể sử dụng EF. Điều đó giải quyết được vấn đề của tôi, thêm một tệp app.config khác. – Fore

Trả lời

7

Tôi thấy bạn đang sử dụng EDMX với hỗ trợ Templates (.tt) để tạo ra các lớp học. Nhưng nếu bạn nhận được thông tin từ một cơ sở dữ liệu hiện có, trình hướng dẫn sẽ tạo ra một ConnectionString tương thích với ObjectContext (thông tin siêu dữ liệu và nhà cung cấp của entityframework).

Vấn đề là chuỗi kết nối bạn đang sử dụng là dành cho ObjectContext (Cơ sở dữ liệu Đầu tiên và Mô hình Đầu tiên). Đối với DbContext, bạn nên sử dụng chuỗi kết nối mà không có thông tin siêu dữ liệu.

chuỗi kết nối của bạn nên là:

<connectionStrings> 
<add name="PasDBEntities" 
    connectionString="data source=localhost; 
         initial catalog=PasDB; 
         integrated security=True; 
         pooling=False; 
         multipleactiveresultsets=True; 
         App=EntityFramework" 
    providerName="System.Data.SqlClient" /> 

+1

thực sự trong EF5 bạn sẽ có thể sử dụng kết nối edmx và thực thể với DbContext. Trong VS2012 T4 đã được thay đổi để tạo ra DbContext cho DatabaseFirst. – Pawel

+1

Tôi đã thực sự cố gắng để di chuyển từ Mã đầu tiên, vào cơ sở dữ liệu đầu tiên. Câu trả lời của bạn chỉ ra rằng chúng tôi cần sử dụng chuỗi siêu dữ liệu đặc biệt - cảm ơn vì điều đó. Về cơ bản, điều này có nghĩa là khi sử dụng thuật sĩ ADO.NET, chuỗi "Lưu chuỗi kết nối" cần sử dụng. – Worthy7