2016-07-11 4 views
0

ユーザーがページ上の特定の要素の横にあるボタンをクリックすると、エレメントにisAccepted値を変更してもらいます。ボタンが押されると、db.SaveChanges()コマンドはEntityValidationErrors型の例外をスローします。EF6相対テーブル値の更新

コントローラ

namespace WebApplication6.Controllers 
{ 
    public class AppController : Controller 
    {   
     [HttpGet] 
     public ActionResult Accept(int? id) 
     { 

      EmailFormModel itemToUpdate = db.ProjectInfo.Find(id); 

      itemToUpdate.isAccepted = true; //only value I want to change 

      db.SaveChanges(); 


      return RedirectToAction("MainDbView"); 
     } 
    } 
} 

モデル

public class EmailFormModel 
{ 
    public EmailFormModel() 
    { 
     isAccepted = false; 
     Ressurs = new List<RessursBehov>() { new RessursBehov() }; 
    } 

    public int id { get; set; } 

    public bool isAccepted { get; set; } 

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Prosjektnummer"), RegularExpression(@"^([pP])\d*$", ErrorMessage = "Prosjektnummer er på formen: p1234 ")] 
    public string Prosjektnummer { get; set; } 

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Prosjektnavn")] 
    public string Prosjektnavn { get; set; } 

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Prosjekttype")] 
    public string Prosjekttype { get; set; } 

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Prosjektleder")] 
    public string Prosjektleder { get; set; } 

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Skjema utfylt av")] 
    public string Prosjektregistrerer { get; set; } 

    [Required] 
    public virtual List<RessursBehov> Ressurs { get; set; } 

} 
public class RessursBehov 
{ 
    public int id { get; set; }  

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Ressurstype")] 
    public string Ressurstype { get; set; } 

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Navn på ressurs")] 
    public string Navn_På_Ressurs { get; set; } 

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Ukenummer"), RegularExpression(@"^([1-9]|[1-4][0-9]|5[0-2])$", ErrorMessage = "Ugyldig verdi")] 
    public int? Ukenummer { get; set; } 

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Antall timer"), RegularExpression(@"^([1-9]|[1-9][0-9])$", ErrorMessage = "Ugyldig verdi")] 
    public int? Antall_Timer { get; set; } 

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Antall uker"), RegularExpression(@"^([1-9]|[1-9][0-9])$", ErrorMessage = "Ugyldig verdi")] 
    public int? Antall_Uker { get; set; } 

    [Required] 
    public virtual EmailFormModel realemailformmodel { get; set; } 
} 

Contextクラス

public class TalkToDb : DbContext 
{ 
    public DbSet<EmailFormModel> ProjectInfo { get; set; } 

    public DbSet<RessursBehov> ProjectExtra { get; set; } 


    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     //one-to-many 
     modelBuilder.Entity<RessursBehov>() 
        .HasRequired<EmailFormModel>(s => s.realemailformmodel) 
        .WithMany(s => s.Ressurs); 
    } 
} 

UPDATE

これは私が取得エラーです:スロー

例外:EntityFramework.dll iisexpress.exe情報の 'System.Data.Entity.Validation.DbEntityValidationException':0:不動産:Ressurstypeエラー:påkrevet

iisexpress.exe情報:0:不動産:Navn_På_Ressursエラー:påkrevet

iisexpress.exe情報:0:不動産:Ukenummerエラー:påkrevet

iisexpress.exe情報:0:不動産:Antall_Timerエラー:påkrevet

iisexpress.exe情報:0:不動産:Antall_Ukerエラー:påkrevet

+0

http://stackoverflow.com/questions/5400530/validation-failed-for-one-or-more-entities-while-saving-changes-to-sql-server-da - 有用な洞察力エラーをデバッグするには – RabidDog5150

+0

例外を書き込む –

答えて

0

は、その例外は、エンティティが検証に失敗したことを意味します。デバッグする場合は、ModelStateオブジェクトを検査して、空でないErrorsプロパティを持つアイテムを探します。

また、あなたは少しより説明する例外を書き換えることができます。実際に、それは非常に簡単にあなたが必要なものを伝えるためになって、例外メッセージの一部として、各検証エラーを一覧表示されます

try 
{ 
    db.SaveChanges(); 
} 
catch (DbEntityValidationException e) 
{ 
    var errorMessages = e.EntityValidationErrors 
     .SelectMany(x => x.ValidationErrors) 
     .Select(x => x.ErrorMessage); 

    var fullErrorMessage = string.Join("; ", errorMessages); 
    var exceptionMessage = string.Concat(e.Message, " The validation errors are: ", fullErrorMessage); 
    throw new DbEntityValidationException(exceptionMessage, e.EntityValidationErrors); 
} 

修正する。リポジトリまたはサービスを使用している場合は、実際にこれを「保存」メソッドに組み込むことができるため、エンティティを保存するたびにtryブロックを使用する必要はなく、自動的に行われます。

関連する問題