5

事前バインディングを使用して連絡先エンティティに PostUpdate プラグインを作成しています。
残念ながら、1:x 関係を表すすべてのプロパティは null です。
コードは非常に単純です。
* CRMcontext は CrmSvcUtil.exe によって生成されたファイルです。
* service は LocalPluginContext からの IOrganizationService です。

using ( var serviceContext = new CRMcontext(service) )
{
  // This works fine
  var contact = serviceContext.CreateQuery<Contact>().First(c => c.Id == context.PrimaryEntityId);

  // why is currency null after this line?! (and yes, it's set in the entity)
  var currency = contact.transactioncurrency_contact;
}

この例 (最後のコード スニペット) に従いました: http://msdn.microsoft.com/en-us/library/gg695791.aspx

助けてくれてありがとう!

編集:

/// <summary>
/// N:1 transactioncurrency_contact
/// </summary>
[Microsoft.Xrm.Sdk.AttributeLogicalNameAttribute("transactioncurrencyid")]
[Microsoft.Xrm.Sdk.RelationshipSchemaNameAttribute("transactioncurrency_contact")]
public TransactionCurrency transactioncurrency_contact
{
    get
    {
        return this.GetRelatedEntity<TransactionCurrency>("transactioncurrency_contact", null);
    }
    set
    {
        this.OnPropertyChanging("transactioncurrency_contact");
        this.SetRelatedEntity<TransactionCurrency>("transactioncurrency_contact", null, value);
        this.OnPropertyChanged("transactioncurrency_contact");
    }
}
4

3 に答える 3

1

私の理解では、LINQ クエリは FetchXML を作成するだけであり、特に要求しない限りリレーションシップは展開されません。

必要なリレーションシップを取得するには、LINQ クエリで結合を実行する必要がありますが、CRM 2013 SDK によると、LINQ クエリは内部結合のみをサポートすることに注意してください。そのため、関係が欠落しているレコードを取り戻すことはできません。

SVC Util を使用して、SDK 拡張機能アセンブリ (プラグイン内での使用が難しい場合があります) で早期バインド型を生成する場合、拡張機能が持つコンテキストは、プロパティにアクセスするときに自動展開できます。詳細については、Microsoft.Xrm.Client.CrmOrganizationServiceContextクラスを参照してください。Attach を呼び出してエンティティをコンテキストにアタッチしていない場合は、エンティティをアタッチする必要があります。これはリレーションシップのクエリを遅延して実行するだけなので、舞台裏で複数のクエリになることに注意してください。

すべてを 1 つのクエリで行い、LEFT 結合が必要な場合は、FetchXML を直接使用してみてください。

編集: また、指定した MSDN リンクでは、LoadProperty を呼び出さない限り、関連するエンティティがどのように null になるかを例が示していることに注意してください。そのため、LoadProperty を呼び出すだけで、必要なものをロードできます。

于 2014-01-20T19:50:50.613 に答える
1

CRM の 2016 更新では、いくつかの変更が加えられました。Daryl が提案したように、LoadProperty メソッドを使用する必要があります。これは機能します。

CodeGeneration.CodeCustomization を使用して事前にバインドされたエンティティを生成しましたが、残念ながら CRM 2016 SDK には必要な Microsoft.Xrm.Client.CodeGeneration.dll がないようです。そのため、2016 年の更新以降、この方法は機能しなくなりました。

于 2016-02-26T07:34:15.397 に答える