C# WCF RIA Services+实体框架4无法连接到数据库
底线是我无法将我的EF模型连接到数据库,但我将提供一些背景信息: 该解决方案是从silverlight业务应用程序模板设计的: 解决方案 解决方案silverlight用户界面 solution.domain包含model.edmx和存储库,如下所示 解决方案.Web RIA服务 解决方案.domain 我使用EF设计器创建了模型。它有5个类,如下所示:C# WCF RIA Services+实体框架4无法连接到数据库,c#,silverlight-4.0,.net-4.0,entity-framework-4,wcf-ria-services,C#,Silverlight 4.0,.net 4.0,Entity Framework 4,Wcf Ria Services,底线是我无法将我的EF模型连接到数据库,但我将提供一些背景信息: 该解决方案是从silverlight业务应用程序模板设计的: 解决方案 解决方案silverlight用户界面 solution.domain包含model.edmx和存储库,如下所示 解决方案.Web RIA服务 解决方案.domain 我使用EF设计器创建了模型。它有5个类,如下所示: Account * - * Contact 1 - * PhoneNumber 1 | * Location * - 1 A
Account * - * Contact 1 - * PhoneNumber
1
|
*
Location * - 1 Address
帐户有联系人列表和位置列表
联系人有firstname/lastname和电话号码列表
电话号码具有通常的区号/中继线/号码/说明
地点只有一个地址列表
地址具有通常的街道地址/城市/省州/邮政编码
每个实体都有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;
}
解决方案.Web
我没有涉及这个项目,只是添加了一个名为AccountService的DomainService,其中包括模型中的所有表。我创建它是为了验证我可以实现端到端的连接;一旦我弄明白了如何让它运行起来,以支持更专注的服务,我就会删除它。生成了一个类,在这里是原型:
[EnableClientAccess()]
public class AccountService : LinqToEntitiesDomainService<ModelContainer>
{
[Query(IsDefault=true)]
public IQueryable<Account> GetAccounts();
/* repeat above for all types in the model */
}
结果
当我运行silverlight站点时,它可以正常加载,我可以导航到主页/关于页面,但是当我导航到帐户页面时,我遇到了一些异常。目前我得到最多的是:
查询“GetAccounts”的加载操作失败。不支持关键字:“数据源”
这一点让我有点吃惊,但当我在'this.context=newObjectContextConnString;'上设置断点时我注意到它得到的连接字符串是:
数据源=。\SQLEXPRESS;综合安全=SSPI;AttachDBFilename=|数据目录| aspnetdb.mdf;用户实例=true
这在我的解决方案中根本不存在
即便如此,如果我手动输入web.config中的连接字符串,我会得到:
查询“GetAccounts”的加载操作失败。指定的命名连接在配置中找不到、不打算与EntityClient提供程序一起使用,或者无效
如果有人需要知道,就在这里:
元数据=res:///Model.Model.csdl|res:///Model.Model.ssdl|res://*/Model.Model.msl;provider=System.Data.SqlClient;提供程序连接字符串=\;数据源=。\SQLEXPRESS;初始目录=数据库名称;综合安全=真实;MultipleActiveResultSets=True\
我知道这本书很值得一读,但我想不出还有什么别的办法可以让它端到端地工作。我需要一些帮助。LocalSqlServer是业务应用程序模板中包含的身份验证、角色和配置文件提供程序的默认连接字符串名称。除非您合并了数据库,否则我建议对EF模型使用不同的连接字符串名称
[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>();
}
<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" />
private void Page_Loaded(object sender, RoutedEventArgs e)
{
AccountContext context = new AccountContext();
dataGrid1.ItemsSource = context.Accounts;
context.Load(context.GetAccountsQuery());
}