私は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)
使用していないと思います。Single
First
誰かが私を助けてくれます-これらのエラーがないコードジェネレーターを使用できますか、またはこれらのエラーを修正するにはどうすればよいですか? 私はVS 2010を持っています。
編集:サーバーがオブジェクトをクライアントに送信するとサービスは機能しますが、クライアントが挿入すると失敗します。クライアント サービス参照構成で、コレクション タイプを次のように変更しました。
System.Collection.Generic.List