Как вернуть сложные типы из службы данных WCF?

Можно ли вернуть сложный тип из службы данных WCF, состоящей из коллекций типов сущностей?

Например :

 //the complex type to return
 class Entities
 {
    ICollection<Contract> Contracts;
    ...

 }

 //configuration
 public partial class MyContext: DbContext
 {
    public MyContext()
        : base("name=DBEntities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.ComplexType<Entities>();
        modelBuilder.Entity<Contract>().HasKey(c=>c.Id);
        ...
    }
    ...
  }

 //the WCF Data Service
 public class PricingDataService : DataService<ObjectContext>, IDisposable
 {
     [WebGet]
     public Entities GetEntities()
     {
         return new Entities();
     }
  }

Когда я пробую приведенную выше конфигурацию, я получаю исключение:

" The exception message is 'One or more validation errors 
were detected during model     generation: System.Data.Edm.EdmEntityType: Name: 
Each type name in a schema must be unique. Type name 'Contract' was already 
defined."

person Attilah    schedule 12.04.2011    source источник
comment
Что происходит, когда вы пытаетесь это сделать?   -  person John Saunders    schedule 12.04.2011
comment
Я получаю исключение: сообщение об исключении: «Во время создания модели обнаружена одна или несколько ошибок проверки: System.Data.Edm.EdmEntityType: Name: Имя каждого типа в схеме должно быть уникальным. Имя типа «Контракт» уже определено.   -  person Attilah    schedule 12.04.2011
comment
Таким образом, это, казалось бы, не имеет ничего общего с возвратом сложного типа. Это проблема вашей модели.   -  person John Saunders    schedule 12.04.2011
comment
Я не понимаю, почему это может быть проблемой с моей моделью, потому что, когда я комментирую эту строку кода: modelBuilder.ComplexType‹Entities›(); ошибка исчезает.   -  person Attilah    schedule 12.04.2011
comment
И что строит modelBuilder? И мы оба смотрим на одно и то же сообщение об ошибке? Во время создания модели обнаружена одна или несколько ошибок проверки.   -  person John Saunders    schedule 12.04.2011
comment
modelBuilder вызывается в методе OnModelCreating для указания первичных ключей и определенного поведения объектов моей модели.   -  person Attilah    schedule 12.04.2011
comment
Он вообще строит модель?   -  person John Saunders    schedule 12.04.2011
comment
Он создается, если я закомментирую строку, упомянутую ранее.   -  person Attilah    schedule 12.04.2011


Ответы (2)


Нет, это невозможно, потому что если вы определяете это, это означает, что сложный тип имеет свойство навигации для контрактов. Это не разрешено во всей структуре сущности. Ошибка, вероятно, возникает из-за какого-то вывода, где Contract уже определен как объект, но сложный тип пытается отобразить его как что-то еще, но это всего лишь предположение.

person Ladislav Mrnka    schedule 12.04.2011
comment
Есть ли способ обойти это поведение? - person Attilah; 12.04.2011
comment
Не знаю, как это работает со службами данных. Вы можете использовать пользовательский несопоставленный тип, но вопрос в том, как служба данных справляется с этим? - person Ladislav Mrnka; 12.04.2011
comment
Почему бы вам просто не запросить набор контрактов у клиента? - person Ladislav Mrnka; 12.04.2011
comment
У меня есть, может быть, 12 сущностей, которые следует регулярно опрашивать и которые тесно связаны друг с другом. Мне нужно отправить обратно этот граф объектов, чтобы клиент случайно не забыл запросить одну или две сущности, которые могли измениться за это время. у вас есть рекомендации для этого? - person Attilah; 13.04.2011
comment
Это похоже на случай пользовательской службы wcf. Не для службы данных wcf. - person Ladislav Mrnka; 13.04.2011
comment
Я использую службу wcf, потому что в основном я просто предоставляю данные клиентам, я не выполняю никакой обработки. - person Attilah; 14.04.2011

По какой-то причине фрагмент, который вы разместили, трудно читать для меня. Тем не менее, я могу сказать вам, что я отправлял через типы WCF, подобные этим. Обычно я не использую ICollection‹> для объявления своих списков, вместо этого я обычно использую List‹>, и у меня никогда не было особых проблем с получением информации о клиенте.

Возможно, проблема в том, как вы определяете класс в своем контракте данных.

person Efren    schedule 12.04.2011
comment
Мне интересно, как вы это делаете. в ваших сложных типах у вас есть списки типов сущностей? - person Attilah; 13.04.2011
comment
Правильный. У меня есть что-то вроде этого в качестве контракта данных: public class SomeClass { private List‹SomeEntity› mCustomers; public List‹SomeEntity› Customers{get{return mCustomers;}set{mCustomers = value}} } Затем в моем сервисе: public SomeClass GetSome(){...} Я еще не знаю, как публиковать фрагменты. Попозже попробую что-нибудь состряпать. - person Efren; 14.04.2011
comment
Пожалуйста, опубликуйте это. это помогло бы мне понять, что я делаю неправильно... - person Attilah; 14.04.2011
comment
вы используете службы данных WCF? тот, который основан на REST? мы не говорим об услугах SOAP. - person Attilah; 14.04.2011