WCFはオーバーライドされたプロパティを生成しません.WCFはWSDLに表示されません。 SalesforceはWSDLをインポートするときに継承を認識しません。基本クラスから継承するクラスを含むDataContractを持つWCFサービスのクライアントとしてSalesforceを使用することには何が関係していますか?
答えて
私は照会していたテーブルの共通の列(プロパティ)を含む基本クラス(Base)を作成しました。
- PDSTATUS
- PCSTATUS
- PHSTATUS
これら3列[で基本クラスのステータスになりました(名前=「STATUS:列名は2文字の接頭辞を除いて同じでした")]属性と、派生クラスに格納されている接頭辞:
using System;
using System.Runtime.Serialization;
using System.Data.Linq.Mapping;
public class Class1
{
[DataContract]
[KnownType(typeof(Contract))]
[KnownType(typeof(Product))]
[KnownType(typeof(Customer))]
public abstract class Base
{
protected virtual string _sourcePrefix { get; private set; }
//[DataMember(EmitDefaultValue = false)] // Doesn't seem to do anything
[IgnoreDataMember] // Only way I could get this to not show up in the WSDL for Base class
public virtual string Id { get; protected set; }
[Column(Name = "PRCNGID")] // This is the key for Contracts, foreign key for Customers and Products
[IgnoreDataMember] // I don't want this to show up in the Base class in the WSDL, only for Contract
public virtual string ContractId { get; set; }
[Column(Name = "EFFDT")]
[DataMember]
public DateTime? EffectiveDate { get; set; }
[Column(Name = "EXPDT")]
[DataMember]
public DateTime? ExpirationDate { get; set; }
[Column(Name = "STATUS")]
[DataMember]
public Statuses Status { get; set; }
}
[Table(Name = "PRPCN10C")]
[DataContract]
[KnownType(typeof(Base))]
public class Contract : Base
{
protected override string _sourcePrefix { get { return "PC"; } }
//[IgnoreDataMember] // Using ContractId field instead for this class' Id
//public override string Id
//{
// get { return base.Id; }
// protected set { base.Id = value; }
//}
[Column(Name = "PRCNGID")]
[DataMember]
public new string ContractId
{
get { return base.ContractId; }
set { base.ContractId = value; }
}
[Column(Name = "PRCNGTYP")]
[DataMember]
public Types ContractType { get; set; }
[Column(Name = "NAME")]
[DataMember]
public string Name { get; set; }
[Column(Name = "ROOTCT#")]
[DataMember]
public string RootContractNumber { get; set; }
[Column(Name = "CMTTYP")]
[DataMember]
public string CommitmentType { get; set; }
}
[Table(Name = "PRPCN30H")]
[DataContract]
public class Customer : Base
{
protected override string _sourcePrefix { get { return "PH"; } }
[Column(Name = "SHPTO#")]
[DataMember(Name = "CustomerNumber")]
public new string Id
{
get { return base.Id; }
protected set { base.Id = value; }
}
}
[Table(Name = "PRPCN20D")]
[DataContract]
public class Product : Base
{
protected override string _sourcePrefix { get { return "PD"; } }
[Column(Name = "ITEM")]
[DataMember(Name = "ProductNumber")]
public new string Id
{
get { return base.Id; }
protected set { base.Id = value; }
}
}
}
テーブル属性と列属性を追加しましたReflectionを使用してソースデータベースに対してクエリを作成し、OleDb ExecuteReaderから返されたDataReaderの結果を処理することができました。
私はもともとこのようにオーバーライドを使用して派生クラス内のプロパティを宣言しようとした:
[Column(Name = "ITEM")]
[DataMember(Name = "ProductNumber")]
public new string Id
{
get { return base.Id; }
protected set { base.Id = value; }
}
しかし、WCFは、それをどうするかを知っていないようでした。派生クラスのプロパティを生成するのではなく、基本クラスのプロパティのみを生成し、新しいDataMember名は無視しました。
私はWCFの部分を理解したので、私のサーバーで生成された?singleWSDLを開き、wsdl2apexユーティリティ(ApexクラスページのWSDLから生成)ボタンを使用してSalesforceにインポートしました。
私はXS削除する必要がありました:attribute要素を(wsdl2apexがそれらを好きではない)、と私はそれが3つのApexクラス生成、ということでした後: 1)をシリアル化プロパティ(それは基本的に、このために空であった) 2 )クラス定義:ベース、契約、顧客、製品 3)
たクラス定義ファイルが含まれているSalesforceでウェブコールアウトで使用&メソッドのクラスをこの:
//Generated by wsdl2apex
public class CPQ_PricingContractWSClasses {
public class PricingContract {
public CPQ_PricingContractWSClasses.ArrayOfPricingContract_Contract Contracts;
public CPQ_PricingContractWSClasses.ArrayOfPricingContract_Customer Customers;
public CPQ_PricingContractWSClasses.ArrayOfPricingContract_Product Products;
private String[] Contracts_type_info = new String[]{'Contracts','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'};
private String[] Customers_type_info = new String[]{'Customers','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'};
private String[] Products_type_info = new String[]{'Products','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'};
private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'};
private String[] field_order_type_info = new String[]{'Contracts','Customers','Products'};
}
public class ArrayOfPricingContract_Contract {
public CPQ_PricingContractWSClasses.PricingContract_Contract[] PricingContract_Contract;
private String[] PricingContract_Contract_type_info = new String[]{'PricingContract.Contract','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','-1','true'};
private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'};
private String[] field_order_type_info = new String[]{'PricingContract_Contract'};
}
public class ArrayOfPricingContract_Customer {
public CPQ_PricingContractWSClasses.PricingContract_Customer[] PricingContract_Customer;
private String[] PricingContract_Customer_type_info = new String[]{'PricingContract.Customer','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','-1','true'};
private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'};
private String[] field_order_type_info = new String[]{'PricingContract_Customer'};
}
public virtual class PricingContract_Customer {
public String CustomerNumber;
private String[] CustomerNumber_type_info = new String[]{'CustomerNumber','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'};
private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'};
private String[] field_order_type_info = new String[]{'CustomerNumber'};
}
public virtual class PricingContract_Product {
public String ProductNumber;
private String[] ProductNumber_type_info = new String[]{'ProductNumber','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'};
private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'};
private String[] field_order_type_info = new String[]{'ProductNumber'};
}
public virtual class PricingContract_Contract {
public String CommitmentType;
public String ContractType;
public String Name;
public String RootContractNumber;
public String ContractId;
private String[] CommitmentType_type_info = new String[]{'CommitmentType','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'};
private String[] ContractType_type_info = new String[]{'ContractType','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','false'};
private String[] Name_type_info = new String[]{'Name','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'};
private String[] RootContractNumber_type_info = new String[]{'RootContractNumber','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'};
private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'};
private String[] field_order_type_info = new String[]{'CommitmentType','ContractType','Name','RootContractNumber'};
}
public virtual class PricingContract_Base {
public DateTime EffectiveDate;
public DateTime ExpirationDate;
public String Status;
private String[] EffectiveDate_type_info = new String[]{'EffectiveDate','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'};
private String[] ExpirationDate_type_info = new String[]{'ExpirationDate','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'};
private String[] Status_type_info = new String[]{'Status','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','false'};
private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'};
private String[] field_order_type_info = new String[]{'EffectiveDate','ExpirationDate','Status'};
}
public class ArrayOfPricingContract_Product {
public CPQ_PricingContractWSClasses.PricingContract_Product[] PricingContract_Product;
private String[] PricingContract_Product_type_info = new String[]{'PricingContract.Product','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','-1','true'};
private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'};
private String[] field_order_type_info = new String[]{'PricingContract_Product'};
}
}
それは、近くに見えますが、何も仮想として宣言されておらず、あなたのコード内のクラス/プロパティを使用しようとした場合、あなたはこのようなエラーになりますなど、
を拡張決してありません。
Webサービスコールアウトに失敗しました:コールアウト応答を解析できません。エイペックスタイプが要素に見つかりませんEffectiveDate
Saleforceのサポートでは、Webコールアウトで継承はサポートされていないため、すべてのプロパティと_type_infoフィールドのコピー/ペーストをBaseクラスから各派生クラス。 field_order_type_infoフィールドを更新し、Baseクラスからコピーしたプロパティを追加する必要もありました。次に、変更後のクラスの例を示します。
public virtual class PricingContract_Product {
public DateTime EffectiveDate { get; set; }
public DateTime ExpirationDate { get; set; }
public String ProductNumber { get; set; }
public String Status { get; set; }
private String[] EffectiveDate_type_info = new String[]{'EffectiveDate','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'};
private String[] ExpirationDate_type_info = new String[]{'ExpirationDate','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'};
private String[] ProductNumber_type_info = new String[]{'ProductNumber','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','true'};
private String[] Status_type_info = new String[]{'Status','http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract',null,'0','1','false'};
private String[] apex_schema_type_info = new String[]{'http://schemas.datacontract.org/2004/07/SFDC.Services.DataContract','true','false'};
private String[] field_order_type_info = new String[]{'EffectiveDate','ExpirationDate','ProductNumber','Status'};
}
Visualfourceページからこれらのクラスとプロパティにアクセスしていたため、{get; }をすべてのプロパティに渡して、VFがそれらを見るようにします。他のコードでクラスを拡張したいので、私は手動で仮想を追加しました。
- 1. WCF DataContract:シナリオに応じて基本クラスまたは継承クラスを返す
- 2. 基本クラスから継承するものは何ですか?
- 3. 派生クラスのメンバー関数は、基本クラスから仮想を継承していますか?
- 4. 基本クラスで使用し、派生クラスと継承
- 5. テンプレートの基本クラスを基本クラスの引数として使用するクラス
- 6. サブクラスがC++の基本クラスから継承するものは何ですか?
- 7. 基本クラスから継承クラスにキャストするときにInvalidCastExceptionが発生しますか?
- 8. コンストラクタでパラメータをとる基本クラスの継承シングルトンクラスですか?
- 9. リフレクションを使用してクラスを継承しない基本クラスのプロパティのみを取得する
- 10. クラスから継承したクラスとDelphiのインターフェイスから継承するクラスを作成できますか?
- 11. Castle Windsorを使用してクラスが同じ基底クラスから継承するときに依存関係を挿入する
- 12. 抽象クラス、コードの重複を避ける方法は?私は基本クラスから継承これらのスバとSUBBクラスを持っている
- 13. メソッドを持つWCF DataContractクラス
- 14. DelphiクライアントからWCFを使用する(配列と継承)
- 15. scala:型パラメータから基本クラスを継承する
- 16. Gileadを使用して継承を継承するクラス
- 17. 基本クラス(Flash)と継承の説明
- 18. WCF - 元のコードをコピー/貼り付けしたり、共有抽象クラスの自動生成コードでDataContractを使用しますか?私もDataContractsている他のクラスの基本クラスとして使用し、基本クラスである
- 19. 私はシャープアーチEntityクラスから継承する基本クラスを持つシャープアーキテクチャ1.9</p> <p>を使用したシャープ建築と流暢NHibernateは
- 20. どのようにして、基本クラスのすべての継承クラスを取得できますか?
- 21. UML - クラス継承、あなたは何を継承しますか?
- 22. MVC3基本クラスから継承するObjectプロパティのバインド
- 23. Pythonのクラスの継承:はAttributeError:「[サブクラス]」オブジェクトは、私は、次の基本クラスとサブクラス持って何の属性「XXX」
- 24. Lazyから継承するクラスを使用して依存関係をインポートする<>
- 25. PHPのパラメータとしてdataContractを使用してWCFサービスを使用する
- 26. 継承とコピーコンストラクタ - 基本クラスからプライベートフィールドを初期化する方法?
- 27. 基本クラスから継承されたメソッドを呼び出す
- 28. WCF公開クラスを継承します。
- 29. 2つのオブジェクトが同じ基本クラスから継承するかどうかをチェックする方法は?
- 30. パラメータとして基本ケースを持つ関数の派生クラスを渡す