2012-10-15 25 views
8

Tôi đang đấu tranh với việc nhận được một kịch bản đơn giản làm việc trong dự án EntityFramework/MVC4/DatabaseFirst của tôi. Tôi đã tìm thấy rất nhiều ví dụ để làm việc với mã đầu tiên, nhưng không có gì cho DB đầu tiên.SimpleMembershipInitializer sẽ không khởi tạo

Vấn đề tôi đang gặp phải là các InitializeDatabaseConnection là ném một lỗi ("Không thể tìm thấy các nhà cung cấp .Net Framework dữ liệu yêu cầu Nó có thể không được cài đặt..") Mã này trông như thế này:

WebSecurity.InitializeDatabaseConnection("DALEntities", "tblContacts1", "ContactID", "EMail", autoCreateTables: true); 

Tôi không chắc chắn DataProvider nào bị lỗi. Nếu tôi cố gắng để theo dõi 'vào' các cuộc gọi InitializeDatabaseConnection, nó ngay lập tức ném lỗi.

Tôi đang thiếu gì?

Thông tin:
DALEntities là tên của connectionString mà phần còn lại của EF sử dụng. Đoạn mã dưới đây chỉ hoạt động tốt ....

public ActionResult Test() { 
     using (var db = new DALEntities()) { 
      var query = from i in db.TBLINVENTORies 
          orderby i.ITEMNAME 
          select i; 
      var cnt = query.Count(); 
      string str = "Total Inventory: " + cnt; 
      return Content(str); 
     } 
    } 

My phần chuỗi kết nối từ web.config:

<connectionStrings> 
    <add name="DALEntities" connectionString="metadata=res://*/DAL.DAL.csdl|res://*/DAL.DAL.ssdl|res://*/DAL.DAL.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SOMECOMPUTER;initial catalog=SOMEDB;persist security info=True;user id=SOMEID;password=SOMEPASS;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
    </connectionStrings> 

bài này dường như được hỏi cùng một câu hỏi (nhưng trong bối cảnh model- đầu tiên), nhưng chưa có giải pháp nào: Using SimpleMembership with EF model-first

Ngoài ra, tôi thấy rằng có quá tải cho WebSecurity.InitializeDatabaseConnection() với văn bản trợ giúp: Initializes the membership system ((blah blah <snip> ProviderName: the name of the ADO.NET data provider. If you want to use Microsoft SQL Server, the WebMatrix.WebData.WebSecurity.InitializeDatabaseConnection(String, String, String, String, Boolean) overload is recommended. Tôi do muốn kết nối với máy chủ MSSQL ... điều này có cần thiết không?

+0

các dự án của tôi không thích sử dụng chuỗi kết nối EF. thay vào đó, tôi phải thêm một chuỗi kết nối thứ hai là chuỗi kết nối SQL (hoặc sql nhỏ gọn). Tôi đã không chơi với nó để suy nghĩ nhiều để người khác có thể có một ý tưởng tốt hơn – Eonasdan

+0

giá trị của nó một thử ... nhưng chắc chắn cảm thấy giống như một giải pháp ngắn hạn ... – reidLinden

+0

có, mà làm việc để bỏ qua lỗi, nhưng tôi don không nghĩ rằng nó có thể là một ý tưởng tốt để kết nối với cơ sở dữ liệu EF của tôi mà không có lợi ích của EF ....? – reidLinden

Trả lời

7

Nhà cung cấp cho bạn gặp sự cố là nhà cung cấp được chỉ định trong chuỗi kết nối của bạn là System.Data.EntityClient. Tôi nghi ngờ vấn đề là bởi vì dự án của bạn là cơ sở dữ liệu-đầu tiên trong khi các thành viên đơn giản đang sử dụng mã đầu tiên. Tôi không nghĩ rằng bạn có thể kết hợp các phương pháp này trong một cơ sở dữ liệu duy nhất. Hãy thử đặt nó trở lại nơi DefaultConnection được sử dụng cho IntializeDatabaseConnection. Nên có một DefaultConnection trong web.config của bạn được tạo ra bởi giàn giáo MVC4. Chuỗi kết nối này thường sử dụng System.Data.SqlClient làm nhà cung cấp.

Nếu bạn muốn giữ thành viên đơn giản trong cơ sở dữ liệu được sử dụng để lưu trữ thông tin tên miền (tức là DALEntities) thì bạn sẽ cần phải thay đổi phương pháp của mình để sử dụng EF trên miền sang mã đầu tiên. Nếu bạn muốn giữ cơ sở dữ liệu dự án của mình trước tiên, bạn cần phải thiết kế lược đồ thành viên của riêng bạn trong cơ sở dữ liệu và develop custom member and role providers. Đây có lẽ là cách tiếp cận tốt nhất nếu bạn đang thực sự cố gắng tích hợp thông tin người dùng vào mô hình miền của bạn.

+0

Tôi đồng ý với bạn về 'System.Data.EntityClient', nhưng tôi cần phải làm việc với cơ sở dữ liệu thông thường của mình để quản lý người dùng. Nó không phải là một giải pháp khả thi cho tôi để có cơ sở dữ liệu riêng biệt. – reidLinden

+0

@reidLinden - Tôi đã cập nhật câu trả lời của mình dựa trên nhận xét của bạn. –

+0

Cảm ơn bạn. Tôi hiểu những gì bạn đang nói, và tôi nghĩ rằng nó trả lời câu hỏi của tôi đầy đủ. – reidLinden

1

Để đơn giản và rõ ràng, hãy giữ hai chuỗi kết nối trỏ tới cùng một cơ sở dữ liệu. Một cho EF (không quan trọng nếu mã đầu tiên hoặc dữ liệu đầu tiên) và một cho các công cụ WebSecurity của bạn. (Như Chad và Erik nói)

<add name="DataEntities" connectionString="metadata=res://*/Models.DataEntities.csdl|res://*/Models.DataEntities.ssdl|res://*/Models.DataEntities.msl;provider=System.Data.SqlClient;provider connection string='data source=[YOUR_SERVER];initial catalog=[YOUR_DATABASE];integrated security=True;MultipleActiveResultSets=True;App=[YOUR_APP_NAME]'" providerName="System.Data.EntityClient" /> 
<add name="DataDB" connectionString="data source=[YOUR_SERVER];initial catalog=[YOUR_DATABASE];integrated security=True;MultipleActiveResultSets=True;App=[YOUR_APP_NAME]" providerName="System.Data.SqlClient" /> 

Lưu ý rằng các nhà cung cấp khác nhau: EF sử dụng System.data.EntityClient và phi EF có ai sử dụng System.Data.SqlClient.

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