WCF RIA Services + Entity Framework 4 не может подключиться к базе данных - PullRequest
1 голос
/ 18 ноября 2010

Суть в том, что я не могу подключить свою модель EF к базе данных, но я дам некоторую справочную информацию:

Решение выложено так (работает из шаблона бизнес-приложения silverlight):

  • решение
    • решение (silverlight ui)
    • solution.domain (содержит model.edmx и репозиторий, показанный ниже)
    • solution.Web (RIA Services)

solution.domain

Я создал модель с помощью дизайнера EF.Это 5 классов, выложенных так:

Account * - * Contact 1 - * PhoneNumber
   1
   |
   *
Location * - 1 Address
  • Учетная запись имеет список контактов и список местоположений
  • Контакт имеет имя / фамилию и список телефонных номеров
  • PhoneNumber имеет обычный areacode / trunk / number / description
  • Местоположение не имеет ничего, кроме списка адресов
  • Адрес имеет обычный 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; */
}

solution.Web

Я не затрагивал этот проектза исключением добавления DomainService с именем «AccountService», включающего все таблицы в модели.Я создал это, чтобы проверить, что я могу получить это от начала до конца;Я удалю его, как только выясню, как запустить его в пользу более целенаправленных сервисов.Это сгенерировало класс, который здесь прототипирован:

[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 я добавил еще одно представление под названием «Учетные записи» сСетка данных на нем, добавила кнопку к навигации, чтобы перейти на эту страницу, и добавила это в код:

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, либо недействительно.

Если кому-то нужно это узнать, оно находится здесь:

"метаданные = разрешение: ///Model.Model.csdl | разрешение: ///Model.Model.ssdl | разрешение: //*/Model.Model.msl; Provider = System.Data.SqlClient; Строка подключения к провайдеру = \ "; Источник данных =. \ SQLEXPRESS; Начальный каталог = Имя_базы; Интегрированная безопасность = True; MultipleActiveResultSets = True \"; "

Я знаю, что это было много, чтобы прочитать,но я просто не могу придумать что-нибудь еще, чтобы сделать эту штуку сквозной.Я мог бы использовать некоторую помощь.

1 Ответ

0 голосов
/ 18 ноября 2010

«LocalSqlServer» - это имя строки подключения по умолчанию для поставщиков проверки подлинности, роли и профиля, включенных в шаблон бизнес-приложения.Если вы не объединили базы данных, я рекомендую использовать другое имя строки подключения для вашей модели EF.

...