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