Суть в том, что я не могу подключить свою модель 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="Data Source=.\SQLEXPRESS;Initial Catalog=DatabaseName;Integrated Security=True;MultipleActiveResultSets=True""
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 \"; "
Я знаю, что это было много, чтобы прочитать,но я просто не могу придумать что-нибудь еще, чтобы сделать эту штуку сквозной.Я мог бы использовать некоторую помощь.