C# WCF RIA Services+实体框架4无法连接到数据库

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

底线是我无法将我的EF模型连接到数据库,但我将提供一些背景信息:

该解决方案是从silverlight业务应用程序模板设计的:

解决方案 解决方案silverlight用户界面 solution.domain包含model.edmx和存储库,如下所示 解决方案.Web RIA服务 解决方案.domain

我使用EF设计器创建了模型。它有5个类,如下所示:

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=&quot;Data Source=.\SQLEXPRESS;Initial Catalog=DatabaseName;Integrated Security=True;MultipleActiveResultSets=True&quot;"
     providerName="System.Data.EntityClient" />
private void Page_Loaded(object sender, RoutedEventArgs e)
{
    AccountContext context = new AccountContext();
    dataGrid1.ItemsSource = context.Accounts;
    context.Load(context.GetAccountsQuery());
}