2016-11-11 12 views
-1

イベントモデルの編集メソッドに問題が発生しました。私が行っている変更がコードで動作しているように見えてもデータベースに保存されていないことに気付きましたブレークポイントを使ってステップを踏み、すべての行が実行されている)、おそらく外部キーがいくつかの問題を引き起こしていると感じていますが、わかりません。編集メソッドが外部キーと連携していません

これは私が使用していたモデルである:

public class Event 
{ 
    //ID 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int EventID { get; set; } 

    //User ID Foregin Key 
    public string OwnerID { get; set; } 

    //Foreign Key for Club 
    public int VenueID { get; set; } 
    [ForeignKey("VenueID")] 
    public virtual Venue Venue { get; set; } 

    //Title 
    [Required(ErrorMessage = "You must enter a title")] 
    [DataType(DataType.Text)] 
    [Display(Name = "Title")] 
    public string EventTitle { get; set; } 

    //Date 
    [Required(ErrorMessage = "You must enter a date")] 
    [DataType(DataType.Date)] 
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
    [Display(Name = "Date")] 
    public DateTime EventDate { get; set; } 

    //Time 
    [Required(ErrorMessage = "You must enter a start time")] 
    [DataType(DataType.Time)] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:HH:mm}")] 
    [Display(Name = "Time")] 
    public DateTime EventTime { get; set; } 

    //Description 
    [Required(ErrorMessage = "Give your event a brief description")] 
    [DataType(DataType.MultilineText)] 
    [Display(Name = "Details")] 
    public string EventDescription { get; set; } 

    //Event Category 
    [Required(ErrorMessage = "You must select a category from the list")] 
    [Display(Name = "Category")] 
    public Category EventCategory { get; set; } 

    //Youtube Link  
    [Display(Name = "YouTube")] 
    public string EventYouTube { get; set; } 

    //SoundCloud Link 
    [Display(Name = "SoundCloud")] 
    public string EventSoundCloud { get; set; } 

    //Facebook Link 
    [Display(Name = "Facebook")] 
    public string EventFacebook { get; set; } 

    //Twitter Link 
    [Display(Name = "Twitter")] 
    public string EventTwitter { get; set; } 

    //Instagram Link 
    [Display(Name = "Instagram")] 
    public string EventInstagram { get; set; } 

    //Official Website Link 
    [Display(Name = "Website")] 
    [DataType(DataType.Url, ErrorMessage = "This is not a valid Url")] 
    public string EventWebsite { get; set; } 

    //Ticket Price 
    [Display(Name = "Ticket Price")] 
    public double? EventTicketPrice { get; set; } 

    //Ticket Shop Link/ Location 
    [Display(Name = "Ticket Vendor")] 
    public string EventTicketStore { get; set; } 

    //Image File 
    public virtual ICollection<File> Files { get; set; } 
} 

public class File 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int FileId { get; set; } 

    [StringLength(255)] 
    public string FileName { get; set; } 

    [StringLength(100)] 
    public string ContentType { get; set; } 

    public byte[] Content { get; set; } 

    public FileType FileType { get; set; } 

    public int EventID { get; set; } 

    public virtual Event Event { get; set; } 
} 

public class Venue 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int VenueID { get; set; } 

    //Id for the owner of this venue 
    public string OwnerId { get; set; } 

    //List of events for this venue 
    public List<Event> VenueEvents { get; set; } 

    //Name 
    [Required(ErrorMessage = "You must enter a name")] 
    [DataType(DataType.Text)] 
    [Display(Name = "Name")] 
    public string VenueName { get; set; } 

    //Type 
    [DataType(DataType.Text)] 
    [Display(Name = "Type")] 
    public VenueType VenueType { get; set; } 

    //Town 
    [Required(ErrorMessage = "You must select a town from the list provided")] 
    [Display(Name = "Town")] 
    public Town VenueTown { get; set; } 

    //Address 
    [Required(ErrorMessage = "You must enter a street")] 
    [DataType(DataType.Text)] 
    [Display(Name = "Street")] 
    public string VenueAddress { get; set; } 

    //Description 
    [Required(ErrorMessage = "Give your venue a brief description")] 
    [DataType(DataType.MultilineText)] 
    [Display(Name = "Details")] 
    public string VenueDescription { get; set; } 

    //Contact Email 
    [Display(Name = "Email")] 
    [DataType(DataType.EmailAddress, ErrorMessage = "This is not a valid email address")] 
    public string VenueEmail { get; set; } 

    //Contact Number 
    [Display(Name = "Telephone")] 
    [DataType(DataType.PhoneNumber, ErrorMessage = "This is not a valid phone number")] 
    public string VenuePhoneNumber { get; set; } 

    //Image File 
    public virtual ICollection<VenueFile> VenueFiles { get; set; } 
} 

これは、コントローラのメソッドです:

// GET: Events/Edit/5 
public ActionResult Edit(int? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 

    Event @event = db.Events.Find(id); 

    //Image 
    @event = db.Events.Include(s => s.Files).SingleOrDefault(s => s.EventID == id); 

    //Owner ID 
    ViewBag.OID = @event.OwnerID; 

    if (@event == null) 
    { 
     return HttpNotFound(); 
    } 
    ViewBag.VenueID = new SelectList(db.Venues, "VenueID", "OwnerId", @event.VenueID); 


    return View(@event); 
} 

// POST: Events/Edit/5 
// To protect from overposting attacks, please enable the specific properties you want to bind to, for 
// more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit([Bind(Include = "EventID,OwnerID,VenueID,EventTitle,EventDate,EventTime,EventDescription,EventCategory,EventYouTube,EventSoundCloud,EventFacebook,EventTwitter,EventInstagram,EventWebsite,EventTicketPrice,EventTicketStore")] Event @event, HttpPostedFileBase upload) 
{ 
    if (ModelState.IsValid) 
    { 
     Event oldEvent = db.Events.Find(@event.EventID); 

     @event.Venue = oldEvent.Venue; 
     @event.VenueID = oldEvent.VenueID; 
     @event.Files = oldEvent.Files; 

     //Image 
     if (upload != null && upload.ContentLength > 0) 
     { 
      if (@event.Files.Any(f => f.FileType == FileType.EventImage)) 
      { 
       db.Files.Remove(@event.Files.First(f => f.FileType == FileType.EventImage)); 
      } 
      var img = new File 
      { 
       FileName = System.IO.Path.GetFileName(upload.FileName), 
       FileType = FileType.EventImage, 
       ContentType = upload.ContentType 
      }; 
      using (var reader = new System.IO.BinaryReader(upload.InputStream)) 
      { 
       img.Content = reader.ReadBytes(upload.ContentLength); 
      } 
      @event.Files = new List<File> { img }; 
     } 

     db.SaveChanges(); 
     return RedirectToAction("Details", "Events", @event.EventID); 
    } 
    ViewBag.VenueID = new SelectList(db.Venues, "VenueID", "OwnerId", @event.VenueID); 
    return View(@event); 
} 

注:db.SaveChangesを実行すると、以下のようにモデルが表示されます -

EventCategory: Music 
    EventDate: {05/11/2016 0:00:00} 
    EventDescription: "desc edit" 
    EventFacebook: null 
    EventID: 40 
    EventInstagram: null 
    EventSoundCloud: "sc edit" 
    EventTicketPrice: null 
    EventTicketStore: null 
    EventTime: {11/11/2016 22:00:00} 
    EventTitle: "t edit" 
    EventTwitter: null 
    EventWebsite: null 
    EventYouTube: "yt edit" 
    Files: Count = 1 
    OwnerID: "0f1c143f-323a-4e78-9489-89e451f7f30c" 
    Venue: {System.Data.Entity.DynamicProxies.Venue_50A507AAD42F98D777DFCA0F94D77A0D914DD5D61DBECA66C53CA7450EAC1B1A} 
    VenueID: 15 

これは編集ビューで行った変更を正しく反映していますが、これらの変更は私のdbで変わるようです。

は、私はまた、この方法が行われた後、それは常に

答えて

0

db.Entry(@event).State = EntryState.Modified を試してみてください。そしてあなたが今まで何もしない

+0

投稿した値をフィルタリングするために「バインド」を使用しているので、投稿されたイベントを保存すると意図しない副作用が発生する可能性があることに注意してください。 'Bind'に含まれていない値は保存すると消去されます。投稿されたインスタンスは、たとえエンティティクラスであっても、本当に保存するべきではありません。オブジェクトを常にデータベースから取り出し、投稿された値を*オブジェクトにマップします。 –

0

変更に保存詳細メソッドに行く前に、Disposeメソッドにジャンプしていることに気づいていますEntity Frameworkが更新を実行するようになります。 EFはトラッキングを変更し、コンテキスト内の何かが変更されたか、明示的に何かが変更されたことを通知した場合にのみUPDATEのようなものを発行します。あなたはどちらもしなかった。

伝統的には、ここで行ったようにオブジェクトをデータベースから取得し、次にというオブジェクトを投稿値でに変更します。ここでは、投稿されたオブジェクトに変更を加えるだけです。重要なのは、あなたのコンテキストには関連付けられていないということです。データベースから引っ張ったオブジェクトとは、あなたのコンテキストではです。

関連する問題