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

#c# #.net #wcf #wcf-data-services #entity-framework-4.1

#c# #.net #wcf #wcf-data-services #entity-framework-4.1

Вопрос:

Возможно ли вернуть сложный тип из службы данных 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."
  

Комментарии:

1. Что происходит, когда вы пытаетесь это сделать?

2. Я получаю исключение: «Сообщение об исключении «Одна или несколько ошибок проверки были обнаружены во время генерации модели: System.Data.Edm.EdmEntityType: Name: имя каждого типа в схеме должно быть уникальным. Имя типа ‘Contract’ уже определено.»

3. Итак, казалось бы, это не имеет ничего общего с возвращением сложного типа. Это проблема с вашей моделью.

4. Я не понимаю, почему это может быть проблемой с моей моделью, потому что, когда я комментирую эту строку кода: ModelBuilder. complexType<Entities>(); ошибка исчезает .

5. И что это такое, что modelBuilder создает? И мы оба смотрим на одно и то же сообщение об ошибке? «Одна или несколько ошибок проверки были обнаружены во время генерации модели »

Ответ №1:

Нет, это невозможно, потому что, если вы определяете это, это означает, что сложный тип имеет свойство навигации к контрактам. Это недопустимо во всей entity framework. Вероятно, ошибка возникает из-за какого-то вывода, где Contract уже определено как entity, но complext type пытается отобразить его как что-то другое — но это только предположение.

Комментарии:

1. Есть ли какой-либо способ обойти это поведение?

2. Не уверен, как это работает со службами данных. Вы можете использовать пользовательский не сопоставленный тип, но вопрос в том, как служба данных справляется с этим?

3. Почему бы вам просто не запросить набор контрактов у клиента?

4. У меня есть, возможно, 12 объектов, к которым следует регулярно обращаться и которые тесно связаны друг с другом. Мне нужно отправить обратно этот график объектов, чтобы клиент случайно не забыл запросить одну или две сущности, которые могли измениться за это время. у вас есть рекомендации по этому поводу?

5. Это похоже на случай с пользовательской службой wcf. Не для службы данных wcf.

Ответ №2:

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

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

Комментарии:

1. Мне любопытно, как вы это делаете. в ваших сложных типах есть списки типов сущностей?

2. Правильно. У меня есть что-то вроде этого в качестве моего контракта с данными: общедоступный класс SomeClass {private List<SomeEntity> mCustomers; общедоступный список<SomeEntity> Customers{get{return mCustomers;}set{mCustomers = value}} } Затем в моем сервисе: общедоступный SomeClass GetSome(){…} Я пока не знаю, как публиковать фрагменты. Я попытаюсь что-нибудь придумать позже.

3. пожалуйста, опубликуйте это. это помогло бы мне понять, что я делаю неправильно…

4. используете ли вы «Службы данных WCF»? тот, который основан на REST? мы не говорим о службах SOAP.