Ошибка WCF "Последовательность не содержит элементов" - "Коллекция не соответствует заданному размеру"
Я новичок в WCF. Я начинаю создавать проект WCF, который сохраняет информацию о людях в базе данных EF.
У меня было много ошибок, и я исправлял их при поиске на разных сайтах, но недавно меня остановили некоторые ошибки, и я не могу их исправить.
Мой проект n-уровневый с моделью данных Entity Framework. Существует 4 слоя для сервера.
DAL (содержит EF dataModel)-> BLL (библиотека классов для вставки / обновления / удаления функций)-> уровень службы (библиотека классов wcf)-> уровень хоста (служба windows)
Я размещаю свой сервис в службе Windows. Привязка службы является nettcpbinding. Я настраиваю службу, так что нет проблем здесь.
У меня есть проект с именем "Common"(библиотека классов), к которому все 4 проекта имеют доступ к нему, и, как вы знаете, я создаю генератор кода и вставляю сгенерированный класс в общий.(Отдельная модель класса с DAL).
Теперь клиент имеет только (Host Layer) service reference.in клиент, у меня есть все классы сущностей в классе обслуживания.
Проблема возникает, когда я хочу вставить объект в базу данных. Смотрите код ниже:
Сторона сервера (это в BLL и сервисном слое):
namespace BLL
{
public static class bz
{
public static class People
{
public static void myInsert(Common.People p, out bool Result)
{
Result = false;
Common.EFContainer cntx = new Common.EFContainer();
cntx.ContextOptions.ProxyCreationEnabled = false;
cntx.ContextOptions.LazyLoadingEnabled = false;
if (p.FirstName == "" || p.FirstName == null)
{
throw new Exception("Fill Fist Name") ;
}
// ... more validate
//-->I Do not use first or single etc in validating<--
try
{
cntx.Peoples.AddObject(p);
cntx.SaveChanges();
Result = true;
}
catch (Exception ex)
{
throw ex;
}
}
}
public static class Gender
{
public static List<Common.Gender> GetData()
{
Common.EFContainer cntx = new Common.EFContainer();
cntx.ContextOptions.ProxyCreationEnabled = false;
cntx.ContextOptions.LazyLoadingEnabled = false;
return cntx.Genders.ToList();
}
}
}
}
namespace ServiceLayer
{
[ServiceContract(SessionMode = SessionMode.Required)]
public interface IService
{
[FaultContract(typeof(NormalExeption))]
[OperationContract]
bool AddToPeople(Common.People p);
[OperationContract]
List<Common.Gender> GetGenders();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = System.ServiceModel.ConcurrencyMode.Single)]
public class myService : IService
{
[OperationBehavior]
public bool AddToPeople(Common.People p)
{
try
{
BLL.bz.People.myInsert(p, out result);
return result;
}
catch (Exception ex)
{
var exep = new NormalExeption(ex.Message, ex.Source, 0, Icons.Error);
throw new FaultException<NormalExeption>(exep, new FaultReason(new FaultReasonText(ex.Message)));
}
}
[OperationBehavior]
public List<Common.Gender> GetGenders()
{
return BLL.bz.Gender.GetData();
}
}
}
Сторона клиента:
ServiceRef.People p = new ServiceRef.People();
ServiceRef.myServiceClient client=new ServiceRef.myServiceClient();
p.FirstName="S";
//... Fill Other Fields
p.Childs=new List<ServiceRef.Child>();
p.Childs.Add(new ServiceRef.Child(){FirstName="A"});
p.Gender=client.GetGenders.first();
//... --->No Error Happen Till Here Error Is After This in Service<---
try
{
client.AddToPeople(p);
}
Catch(FaultException fe)
{
messagebox.show(fe.Detail.Message);
}
Мои проблемы:
Обе ошибки происходят на стороне клиента после того, как я вставляю объект people.
Когда я использую Poco Code Generator для My EF, я получаю эту ошибку:
В коллекции не было фиксированного размера
Эта ошибка возникает в определении классов Poco.
Когда я использую генератор кода самообследования для моего EF, я получаю эту ошибку:
Последовательность не содержит элементов
Я думаю, что эта ошибка возникает в contex.addobject(p)
и я не использую Single
Или же First
в моем коде, которые возвращают это исключение.
Кто-то мне поможет - какой генератор кода я могу использовать, у которого нет этих ошибок, или как я могу исправить эти ошибки? У меня VS 2010.
Редактировать: служба работает, когда сервер отправляет объекты клиенту, но при вставке клиентом происходит сбой. В конфиге справочной службы клиентов я изменил тип коллекции на: System.Collection.Generic.List