Форум программистов, компьютерный форум, киберфорум
C#: Веб-сервисы и WCF
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 2
Регистрация: 23.02.2013
Сообщений: 79
1

WCF + EF + ASP.NET MVC. Как передавать связанные данные?

24.03.2014, 23:51. Показов 2443. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Совсем недавно начал разбираться в WCF.
Есть две модели
C#
1
2
3
4
5
6
7
8
9
10
11
12
 [DataContract]
    public class Telephone
    {
        [DataMember]
        public int TelephoneId { get; set; }
        [DataMember]
        public int Number { get; set; }
        [DataMember]
        public int ContactId { get; set; }
        [DataMember]
        public Contact Contact { get; set; }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
    [DataContract]
    public class Contact
    {
        [DataMember]
        public int ContactId { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string Address { get; set; }
        [DataMember]
        public ICollection<Telephone> Telephone { get; set; }
    }
Использую их для EF и WCF.

C#
1
2
3
4
5
   public class ContactsContext:DbContext
    {
        public DbSet<Contact> Contacts { get; set; }
        public DbSet<Telephone> Telephones { get; set; }
    }
Реализация сервиса

C#
1
2
3
4
5
6
7
8
9
10
11
12
  public class ServiceContacts : IServiceContacts
    {
        ContactsContext contactContext;
        public IQueryable<Contact> GetAllContact()
        {
            contactContext = new ContactsContext();
 
            var contacts = contactContext.Contacts.Where(m => m.ContactId > -1);
            
            return contacts;
        }
   }
Пытаюсь вызвать этот метод в контроллере

C#
1
2
3
4
5
6
   public ActionResult Index()
        {
            var service = new ServiceReference1.ServiceContactsClient();
            var contacts=service.GetAllContact();
            return View(contacts);
        }
И каким-то неведомым для меня образом GetAllContact() возвращает ServiceReference1.Contact[], а не IQueryable<Contact>. С чем это связано и как мне вывести данные из зависимой таблицы (Telephones)?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.03.2014, 23:51
Ответы с готовыми решениями:

Нужны статьи или примеры связки технологий WCF, ASP.NET MVC и SQL Server
Здравствуйте! Я совершенно не разбираюсь в WCF, а надо уже готовить диплом. Не могли бы вы...

WCF в ASP.NET
Доброго времени суток. Задача следующая. Надо сделать что бы служба, которая находится на сайте...

WCF RESTful или ASP.NET Web Application
Доброго времени суток. По наследству достался сервис реализованный как ASP.NET Web Application....

Сайт на MVC: как задействовать службу WCF
Здравствуйте. Пишу сайт на MVC и нужно задействовать службу WCF но ума не приложу как это сделать....

4
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
25.03.2014, 00:07 2
Лучший ответ Сообщение было отмечено wkololo_4ever как решение

Решение

а каким образом по вашему будет обрабатываться IQueryable по WCF? каждый ваш Where отправлять обратно сервису чтобы он обработал это в базе? нет, так не пойдет

вы можете передавать стандартные структуры данных
массив - стандартная структура данных, присутствующая во всех языках
IQueryable - нет

переделайте метод так, чтобы он возвращал массив

чтобы возвращал связанные данные - вытащите их в вашем запросе через Include
ваш метод должен выглядеть так (_включая_ dispose коннекта к базе!)

C#
1
2
3
4
5
        public Contact[] GetAllContact()
        {
          using(var contactContext = new ContactsContext();
                return contactContext.Contacts.Include(x=>x.Telephone).Where(m => m.ContactId > -1).ToArray();
        }
1
0 / 0 / 2
Регистрация: 23.02.2013
Сообщений: 79
25.03.2014, 00:39  [ТС] 3
Спасибо, данные стали выходить как нужно, но теперь на этапе возвращения массива в контроллер
C#
1
var contacts=service.GetAllContact();
выходит ошибка "Удаленный хост принудительно разорвал существующее подключение" С чем связанна она?
0
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
25.03.2014, 00:48 4
уверены ли вы, что вы не пытаетесь вернуть _слишком_ много данных?
возможно они не влазят в ограничение по объему переданных данных, или время возвращения их из базы превышает таймаут?

судя по коду вы пытаетесь вернуть всю таблицу, вы точно уверены в том, что объем передаваемых данных нельзя сократить?

Добавлено через 4 минуты
посмотрел ваш код, возможно проблема в сериализации - когда вы возвращаете контакты для каждого контакта формируется коллекция телефонов, для каждого из которых сериализуется объект контакта, в каждом из которых есть коллекция телефонов....

вероятно данную структуру просто не получается корректно сериализовать (т.к. они ссылаются друг на друга)

я бы попробовал убрать атрибут DataMember с поля Contact класса Telephone

если эта связь нужна на стороне сервера ее будет легко восстановить
2
0 / 0 / 2
Регистрация: 23.02.2013
Сообщений: 79
25.03.2014, 01:01  [ТС] 5
Цитата Сообщение от Tessen Посмотреть сообщение
я бы попробовал убрать атрибут DataMember с поля Contact класса Telephone
да, это помогло, большое спасибо!
0
25.03.2014, 01:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.03.2014, 01:01
Помогаю со студенческими работами здесь

События и новости связанные с ASP.NET MVC
Поздравляю всех разработчиков с выходом ASP.NET MVC 3.0 RTM (с новым продуктом Nuget, кто не знает...

ASP.NET MVC 4,ASP.NET MVC 4.5 и ASP.NET MVC 5 большая ли разница между ними?
Начал во всю осваивать технологию,теперь хочу с книжкой посидеть и вдумчиво перебрать всё то что...

Посоветуйте литературу по MVVM, MVC, WPF, WCF, ASP.NET, Silverlight
Всем привет, посоветуйте, пожалуйста, литературу/учебники по темам: MVVM, MVC, WPF, WCF,...

как хранить данные сессии в ASP.Net MVC?
Доброго времени суток. Возможно вопрос покажется непомерно тупым, но все же. Необходимо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru