#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.