[英]WCF RIA Services + Entity Framework 4 cannot connect to database
最重要的是,我無法將EF模型連接到數據庫,但是我將提供一些背景信息:
解決方案的布局是如此(使用silverlight業務應用程序模板工作):
solution.domain
我使用EF設計器創建了模型。 這樣布置了5個班級:
Account * - * Contact 1 - * PhoneNumber
1
|
*
Location * - 1 Address
在這個項目中,還有一個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="Data Source=.\SQLEXPRESS;Initial Catalog=DatabaseName;Integrated Security=True;MultipleActiveResultSets=True""
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.