3

EntityFrameworkオブジェクトとそれらをWCF経由で送信することに関して問題があります。データベースがあり、Entity Frameworkはそのデータベースからクラスを作成しました。この特定の状況では、「ウォレット」クラスです。

次のコードを使用してウォレットを転送しようとします。

public Wallet getWallet()
{
    Wallet w = new Wallet();
    w.name = "myname";
    w.walletID = 123;
    return w;
}

そのWalletクラスを転送する必要がありますが、機能しません。常に同じ例外が発生します。

「localhost:8860 / ComplementaryCoins.svcへのHTTP応答の受信中にエラーが発生しました。これは、サービスエンドポイントのバインディングがHTTPプロトコルを使用していないことが原因である可能性があります。これは、HTTP要求コンテキストがサーバーによって中止されていることが原因である可能性もあります(おそらくサービスがシャットダウンしたためです。詳細については、サーバーログを参照してください。」

インターネットで検索したところ、EntityFramework-objectsのシリアル化が必要なためにエラーが発生した可能性があります。

これが当てはまるかどうか、もしそうなら、それをどのように解決するかはまったくわかりません。DataContractは次のようになります(非常に単純です):

[DataContract]
public partial class Wallet
{
    [DataMember]
    public int getwalletID { get { return walletID; } }
    [DataMember]
    public string getname { get { return name; } }
}

誰かがこの問題に遭遇したことがありますか?

編集:Entity Frameworkで作成されたクラスは次のようになります:

namespace ComplementaryCoins
{
    using System;
    using System.Collections.Generic;

    public partial class Wallet
    {
        public Wallet()
        {
            this.Transaction = new HashSet<Transaction>();
            this.Transaction1 = new HashSet<Transaction>();
            this.User_Wallet = new HashSet<User_Wallet>();
            this.Wallet_Item = new HashSet<Wallet_Item>();
        }

        public int walletID { get; set; }
        public string name { get; set; }

        public virtual ICollection<Transaction> Transaction { get; set; }
        public virtual ICollection<Transaction> Transaction1 { get; set; }
        public virtual ICollection<User_Wallet> User_Wallet { get; set; }
        public virtual ICollection<Wallet_Item> Wallet_Item { get; set; }
    }
}

私たちを助けてくれてありがとう。

4

3 に答える 3

16

私はしばらく前に同じ問題を抱えていましたが、これに対する解決策は次のとおりです。

エンティティフレームワークは、通常のクラスではなくシリアル化されたクラスを返していました。例えば。Walletの代わりにWallet_asfawfklnaewfklawlfkawlfjlwfejlkef

これを解決するには、次のコードを追加します。

base.Configuration.ProxyCreationEnabled = false;

コンテキストファイル内。コンテキストファイルは自動生成されるため、Context.ttに追加できます。Context.ttファイルでは、55〜65行目に追加できます。

<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
{
public <#=code.Escape(container)#>()
    : base("name=<#=container.Name#>")
{
base.Configuration.ProxyCreationEnabled = false;
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
    this.Configuration.LazyLoadingEnabled = false;
<#
于 2013-08-02T09:07:58.697 に答える
1

次のように、プロパティのセッターを指定してみてください。

[DataContract]
public partial class Wallet
{
    [DataMember]
    public int getwalletID { get { return walletID; } set { } }
    [DataMember]
    public string getname { get { return name; } set { } }
}

それでも機能しない場合は、この目的で中間POCOクラスを作成し、AutoMapperValueInjecterなどのマッパーライブラリを使用してEFオブジェクトからデータを転送することを検討してください。

POCOクラスには、EFクラスと同じプロパティが必要です。

[DataContract]
public class WalletDTO
{
    [DataMember]
    public int walletID { get; set; }
    [DataMember]
    public string name { get; set; }
}

そして、代わりにこのクラスを返すようにメソッドを変更します。

public WalletDTO getWallet()
{
    Wallet w = new Wallet(); // or get it from db using EF

    var dto = new WalletDTO();        
    //assuming we are using ValueInjecter, this code below will transfer all matched properties from w to dto
    dto.InjectFrom(w); 
    return dto;
}
于 2013-03-07T08:54:34.013 に答える
0

あなたはを受け取ろうとしていIEnumerable<Wallets>ますか?-はいの場合、メソッドIEnumerableを追加してを返すサーバークラスを変更してください.ToArray()

于 2013-03-07T08:43:41.773 に答える