我是 WCF 的新手。我开始创建一个 WCF 项目,将人们的信息保存在 EF 数据库中。
我有很多错误并通过在各个站点中搜索来修复它们,但最近我被一些错误阻止并且无法修复它们。
我的项目是具有实体框架数据模型的n 层。服务器有4层。
DAL(包含 EF 数据模型)--> BLL(用于插入/更新/删除函数的类库)-->服务层(wcf 类库)-->主机层(windows 服务)
我在 Windows 服务中托管我的服务。服务绑定是 nettcpbinding。我将服务配置为 true,所以这里没问题。
我有一个名为“Common”(类库)的项目,所有 4 个项目都可以访问它,并且如您所知,我创建了一个代码生成器并将生成的类粘贴到 common.(使用 DAL 的单独类模型)。
现在cient只有(主机层)服务参考。在客户端,我在服务类中有所有实体类。
当我想将对象插入数据库时会出现问题。请参阅下面的代码:
服务器端(这是在 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);
}
我的问题:
插入人员对象后,这两个错误都发生在客户端。
当我为我的 EF 使用 Poco 代码生成器时,我收到此错误:
集合超出固定大小
此错误发生在 poco 类定义中。
当我为我的 EF 使用自我跟踪代码生成器时,我收到此错误:
序列不包含任何元素
我认为这个错误发生在contex.addobject(p)
并且我没有在我的代码中使用任何返回这个异常的Single
Or 。First
有人帮助我 - 我可以使用哪个代码生成器没有这些错误,或者我该如何修复这些错误?我有VS 2010。
编辑:当服务器向客户端发送对象但客户端插入失败时,该服务工作。在客户端服务参考配置中,我将集合类型更改为:
System.Collection.Generic.List