4

Microsoft Dynamics CRMで新しいフィールドを作成すると、NULL許可されているとおりにデータベースに作成されます。NON-NULL独自のフィールドの一部で使用するように、バッキングデータベースにあるCRMでフィールドを作成するにはどうすればよいですか?

必須フラグを選択しても、NULL以外にはなりません。

質問の理由:LINQを使用してCRMに対してプログラミングする場合、null許容値を処理する必要がある場合、多くのクエリは比較的困難になり、集約クエリのように不可能になるものもあります(試してみてください。基になるdb型がnull許容型の場合に表示されます)Max()InvalidCastException

4

2 に答える 2

2

申し訳ありませんが、これを行うためのサポートされている方法はありません( "supported" == "present in the SDK")。

SQLレベルでは、ひどいハッキング(属性とその依存関係を削除し、NULLを許可しないように再作成してから、元に戻す)がなければ、何もできません。これは、とにかく機能しない可能性があります。

正しい方法は、LINQの問題を克服することだと思います。これは解決策ではありませんか?

于 2012-06-15T09:20:42.810 に答える
1

正確にはあなたが求めているものではありませんが、APIを介して同様の効果を達成することができます。Createとに対するプラグインをUpdate事前検証段階で記述します(データベーストランザクションのnullに値を取得するため)。null不可能な属性がnullになる場合は、例外をスローします。これにより、トランザクションが完全にキャンセルされます。

レコードがすでに作成された後にプラグインを登録する場合は、それらの既存のレコードに値を入力することを確認する必要があります。

public void Execute(IServiceProvider serviceProvider)
{
    IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

    if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
    {
        var target = ((Entity)context.InputParameters["Target"]);
        if (target.LogicalName == Appointment.EntityLogicalName)
        {
            IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
            var entity = target.ToEntity<Xrm.Appointment>();

            if (entity.Description == null && entity.Attributes.Contains("description"))
            {
                throw new Microsoft.Xrm.Sdk.SaveChangesException("Fill in the field, buddy.");
            }
        }
    }
}
于 2012-06-15T19:41:18.790 に答える