私の問題: カスタム検証属性は、webapi post メソッド (EF を使用) を呼び出すときに 1 回ではなく 2 回呼び出されます。次の点で検証します。
ブレークポイントが webapi アプリケーションの post メソッドに入る直前 (おそらく ModelState にデータが入力されます)
ここでも、挿入が行われる直前に (db.Applications.Add(application))
[Table("Applications")] public class Application { /// <summary> /// ApplicationID (auto-increment) /// </summary> [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int ApplicationID { get; set; } /// <summary> /// Name of the application /// </summary> [Required] [MaxLength(255)] public string ApplicationName { get; set; } /// <summary> /// Application ref (for friendly lookups) /// </summary> [Required] [MaxLength(150)] [UniqueApplicationReference] // <<<<<<< My custom validation attribute public string ApplicationRef { get; set; } /// <summary> /// Application status /// </summary> [Required] public bool? ApplicationStatus { get; set; } public virtual ICollection<ApplicationFeature> ApplicationFeatures { get; set; } }
これが私のwebAPIエンドポイントです:
public HttpResponseMessage PostApplication(Application application)
{
if (ModelState.IsValid)
{
db.Applications.Add(application);
db.SaveChanges();
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, application);
response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = application.ApplicationID }));
return response;
}
else
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
}
アプリケーションオブジェクトにデータ転送クラスを提供し、データを渡す目的でほとんど/単純な検証を提供し、ドメイン固有の検証エラーが HttpResponseMessage を介してバブルバックするようにするだけのより良い解決策です。合理的なデータで試みましたか?
ありがとうございました!ダン。