イベントモデルの編集メソッドに問題が発生しました。私が行っている変更がコードで動作しているように見えてもデータベースに保存されていないことに気付きましたブレークポイントを使ってステップを踏み、すべての行が実行されている)、おそらく外部キーがいくつかの問題を引き起こしていると感じていますが、わかりません。編集メソッドが外部キーと連携していません
これは私が使用していたモデルである:
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で変わるようです。
は、私はまた、この方法が行われた後、それは常に
投稿した値をフィルタリングするために「バインド」を使用しているので、投稿されたイベントを保存すると意図しない副作用が発生する可能性があることに注意してください。 'Bind'に含まれていない値は保存すると消去されます。投稿されたインスタンスは、たとえエンティティクラスであっても、本当に保存するべきではありません。オブジェクトを常にデータベースから取り出し、投稿された値を*オブジェクトにマップします。 –