2

私はWCFの初心者です。人の情報を EF データベースに保存する WCF プロジェクトの作成を開始しています。

エラーが多発し、いろいろなサイトを検索して修正したのですが、最近、いくつかエラーが発生して修正できなくなりました。

私のプロジェクトは、エンティティ フレームワークデータ モデルを使用した n 層です。サーバーには4つのレイヤーがあります。

DAL (EF dataModel を含む)--> BLL (挿入/更新/削除関数用のクラス ライブラリ)-->サービス層(wcf クラス ライブラリ)-->ホスト層(Windows サービス)

サービスを Windows サービスでホストしています。サービス バインディングは nettcpbinding です。私はサービスをtrueに設定しているので、ここでは問題ありません。

4つのプロジェクトすべてがアクセスする「Common」(クラスライブラリ)という名前のプロジェクトがあり、ご存知のように、コードジェネレーターを作成し、生成されたクラスを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);
}

私の問題:

people オブジェクトを挿入した後、クライアント側で両方のエラーが発生します。

Poco Code Generator For My EF を使用すると、次のエラーが表示されます。

コレクションは固定サイズではありませんでした

このエラーは、poco クラスの定義で発生します。

EF にセルフ トラッキング コード ジェネレーターを使用すると、次のエラーが表示されます。

シーケンスには要素が含まれていません

このエラーはで発生し、この例外を返すコードではOrをcontex.addobject(p)使用していないと思います。SingleFirst

誰かが私を助けてくれます-これらのエラーがないコードジェネレーターを使用できますか、またはこれらのエラーを修正するにはどうすればよいですか? 私はVS 2010を持っています。

編集:サーバーがオブジェクトをクライアントに送信するとサービスは機能しますが、クライアントが挿入すると失敗します。クライアント サービス参照構成で、コレクション タイプを次のように変更しました。 System.Collection.Generic.List

4

0 に答える 0