2016-12-06 5 views
0

私は学習Dynamics 365プラグインの開発です。Dynamics 365サンドボックスモードで厳密に型指定されたentiyを更新するときにプラグインSDKが例外をスローする

問題:強く型付けされたエンティティでUpdateメソッドを呼び出すと、例外が発生します。正確なエラーメッセージは次のとおりです。

"System.Runtime.Serialization.SerializationException:のMicrosoft Dynamics CRMがエラーを経験している管理者やサポートのためのリファレンス番号:#1330ADC1"

マイセットアップ: 私のソリューションが含まれていますシンプルなプラグイン。強く型付けされたエンティティアカウントを作成しました。プラグインの隔離モードはサンドボックスです。 Telephone1フィールドは文字列です。

私はCRMからアカウントを取得し、Telephone1フィールドを新しい値に更新し、アカウントレコードを更新します。シンプル:)

コード:

public class PostOperationaccountUpdate: IPlugin 
{ 
    public void Execute(IServiceProvider serviceProvider) 
    { 
     var organisationService = serviceProvider.GetService(typeof (IOrganizationService)) as IOrganizationService; 
     var context = serviceProvider.GetService(typeof (IPluginExecutionContext)) as IPluginExecutionContext; 

     var entityAccount = context.InputParameters["Target"] as Entity; 
     var id = entityAccount.Id; 

     var account = organisationService.Retrieve("account", id, new ColumnSet("telephone1")); 

     //Get a strongly typed version of the Account entity 
     var dbAccount = account.ToEntity<Account>(); 

     //Update the telephone1 field using the "old" way 
     account["telephone1"] = "1234567890"; 

     try 
     { 
      //This will pass 
      organisationService.Update(account); 

      //Update the strongly typed Account 
      dbAccount.Telephone1 = "plop"; 

      //This fails 
      organisationService.Update(dbAccount); 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 
} 

私が試してみました何: を - >私はなしに、プラグインの分離モードを変更した - これは働きます!ベストプラクティスによると、それは推奨されません助け ため

おかげチャールズ

+0

ん遅くするとサンドボックス内で動作しますか? – Alex

+0

厳密に型指定されたAccountクラスは、偶然別のDLLにありますか?もしそうなら、あなたはプラグインDLLにそれをilmergeする必要があります。 Account.csクラスをプラグインプロジェクトに直接追加することで、それをすぐにテストできます。 – Polshgiant

+0

@Alex:はい。もし私がそれを遅くしてサンドボックスにしたら、それは動作します – h4ck3r8ug5

答えて

1

SerializationExceptionは、あなたが遅延バインディングの種類、here the MSDN gives some degree of explanationを期待コードと早期の結合タイプを混在する場合に発生します。

本質的に、初期バインド型とレイトバインド型の間の変換をプラットフォームに要求すると例外が発生します。

Updateは、遅延バインディングタイプ

organisationService.Update(dbAccount); // dbAccount should be an 'Entity' object 

を期待し、これは例外が発生します。私は初期の結合タイプを使用することはありません

ので、私は確実にあなたのコードを修正する方法を伝えることはできませんが、次のMSDNの記事が有用である:

+0

'Update'は' Entity' - > 'public virtual void Update(Entity entity);型のオブジェクトを期待しています。後期バインドまたは初期バインドは内部型が 'entity'であり、すべての初期バインドはバックグラウンドで、正しいcrmデータ型で属性値を設定し、取得時にデータを平坦化します。私は 'organisationService 'を使います。更新(エンティティ); '早期オブジェクトと後でバインドされたオブジェクトの両方を使用します。後期または早期のバインドは、両方とも 'Entity'型のオブジェクトであり、作成および更新は互換性があります。 – dynamicallyCRM

+0

Alexに感謝します。それは私に考えさせてくれました。私は自分のコードをリファクタリングします。 ヘルプをよろしくお願いします。 – h4ck3r8ug5

関連する問題