簡體   English   中英

WCF RIA服務+實體框架4無法連接到數據庫

[英]WCF RIA Services + Entity Framework 4 cannot connect to database

最重要的是,我無法將EF模型連接到數據庫,但是我將提供一些背景信息:

解決方案的布局是如此(使用silverlight業務應用程序模板工作):

    • 解決方案(silverlight ui)
    • solution.domain(包含model.edmx和存儲庫,如下所示)
    • solution.Web(RIA服務)

solution.domain

我使用EF設計器創建了模型。 這樣布置了5個班級:

Account * - * Contact 1 - * PhoneNumber
   1
   |
   *
Location * - 1 Address
  • 客戶有一個聯系人列表和一個位置列表
  • 聯系人具有名字/姓氏和電話號碼列表
  • PhoneNumber具有通常的區號/中繼/號碼/說明
  • 位置僅是地址列表
  • 地址具有通常的StreetAddress / City / ProvinceState / PostalZip
  • 每個實體都有ID字段

在這個項目中,還有一個IRepository,它通常像這樣 (對條目后續內容進行了修改),但這里也列出了它:

public interface IRepository : IDisposable
{
    T GetByKey<T>(object key) where T : class;
    IQueryable<T> GetQuery<T>() where T : class;
    IQueryable<T> GetQuery<T>(Expression<Func<T, bool>> predicate) where T : class;
    IQueryable<T> GetQuery<T>(ISpecification<T> criteria) where T : class;
    T Single<T>(Expression<Func<T, bool>> predicate) where T : class;
    T Single<T>(ISpecification<T> criteria) where T : class;
    T First<T>(Expression<Func<T, bool>> predicate) where T : class;
    T First<T>(ISpecification<T> criteria) where T : class;
    void Add<T>(T entity) where T : class;
    void AddRange<T>(IEnumerable<T> entities) where T : class;
    void Attach<T>(T entity) where T : class;
    void Delete<T>(T entity) where T : class;
    void Delete<T>(Expression<Func<T, bool>> predicate) where T : class;
    void Delete<T>(ISpecification<T> criteria) where T : class;
    void SaveChanges();
    void SaveChanges(SaveOptions options);
    T Save<T>(T entity) where T : class;
    T Update<T>(T entity) where T : class;
    IQueryable<T> Find<T>(Expression<Func<T, bool>> predicate) where T : class;
    IQueryable<T> Find<T>(ISpecification<T> criteria) where T : class;
    T FindOne<T>(Expression<Func<T, bool>> predicate) where T : class;
    T FindOne<T>(ISpecification<T> criteria) where T : class;
    IQueryable<T> GetAll<T>() where T : class;
    IQueryable<T> Get<T>(int pageIndex, int pageSize) where T : class;
    IQueryable<T> Get<T>(Expression<Func<T, bool>> predicate, int pageIndex, int pageSize) where T : class;
    IQueryable<T> Get<T>(ISpecification<T> criteria, int pageIndex, int pageSize) where T : class;
    int Count<T>(Expression<Func<T, bool>> predicate) where T : class;
    int Count<T>(ISpecification<T> criteria) where T : class;
}

其實現的構造函數為:

public GenericRepository(string connString)
{
    /* ... */
    this.context = new ObjectContext(connString); 
    /* Defined in the class: private ObjectContext context; */
}

解決方案

除了添加一個名為“ AccountService”的DomainService(包括模型中的所有表)外,我沒有涉及到這個項目。 我創建它是為了驗證我是否可以端到端進行此操作。 一旦弄清楚如何使它運行以支持更具針對性的服務,就將其刪除。 生成了一個類,該類在此處原型化:

[EnableClientAccess()]
public class AccountService : LinqToEntitiesDomainService<ModelContainer>
{
    [Query(IsDefault=true)]
    public IQueryable<Account> GetAccounts();

    /* repeat above for all types in the model */
}

我更改了此類的實現,以包括我的存儲庫的一個實例,並通過類似的服務方法從那里返回查詢:

private IRepository repo;
public AccountService()
{
    this.repo = new GenericRepository(
        ConfigurationManager
        .ConnectionStrings["LocalSQLServer"]
        .ConnectionString);
}

[Query(IsDefault(true)]
public IQueryable<Account> GetAccounts()
{
    return this.repo.GetAll<Account>();
}

Web.Debug.config和Web.Release.config都具有如下定義的連接字符串:

<add name="LocalSQLServer"
     connectionString="metadata=res://*/Model.Model.csdl|res://*/Model.Model.ssdl|res://*/Model.Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQLEXPRESS;Initial Catalog=DatabaseName;Integrated Security=True;MultipleActiveResultSets=True&quot;"
     providerName="System.Data.EntityClient" />

其中DatabaseName是數據庫,在SQLExpress中確實存在(並使用model.edmx.sql創建)。

現在要查看結果,在silverlight項目中,我添加了另一個名為“ Accounts”的視圖,上面帶有一個數據網格,在導航中添加了一個按鈕以轉到該頁面,並將其添加到后面的代碼中:

private void Page_Loaded(object sender, RoutedEventArgs e)
{
    AccountContext context = new AccountContext();
    dataGrid1.ItemsSource = context.Accounts;
    context.Load(context.GetAccountsQuery());
}

結果

當我運行silverlight網站時,它可以很好地加載,我可以導航到主頁/關於頁面,但是當我導航到“帳戶”頁面時,我有很多例外。 目前我得到最多的是:

查詢“ GetAccounts”的加載操作失敗。 不支持的關鍵字:“數據源”。

那讓我有些困惑,但是當我在'this.context = new ObjectContext(connString);'上設置斷點時 我注意到它得到的連接字符串是:

數據源=。\\ SQLEXPRESS;集成安全性= SSPI; AttachDBFilename = | DataDirectory | aspnetdb.mdf;用戶實例= true

這根本不在我的解決方案中的任何地方...

即使這樣,如果我手動輸入在web.config中獲得的連接字符串,那么我得到:

查詢“ GetAccounts”的加載操作失敗。 在配置中找不到指定的命名連接,或者不打算與EntityClient提供程序一起使用,或者無效。

如果有人需要知道它,它在這里:

“ metadata = res:// /Model.Model.csdl|res:// /Model.Model.ssdl|res://*/Model.Model.msl;provider=System.Data.SqlClient;provider連接字符串= \\ “;數據源=。\\ SQLEXPRESS;初始目錄=數據庫名稱;集成安全性=真; MultipleActiveResultSets =真\\”;“

我知道要閱讀很多東西,但是我想不出什么其他事情來使這東西端到端地起作用。 我可以幫忙。

“ LocalSqlServer”是業務應用程序模板中包括的身份驗證,角色和配置文件提供程序的默認連接字符串名稱。 除非您已合並數據庫,否則建議為EF模型使用其他連接字符串名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM