2

我是 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)并且我没有在我的代码中使用任何返回这个异常的SingleOr 。First

有人帮助我 - 我可以使用哪个代码生成器没有这些错误,或者我该如何修复这些错误?我有VS 2010。

编辑:当服务器向客户端发送对象但客户端插入失败时,该服务工作。在客户端服务参考配置中,我将集合类型更改为: System.Collection.Generic.List

4

0 回答 0