モデルを更新しようとしていますが、「操作に失敗しました。1つ以上の外部キープロパティがnull不可であるため、関係を変更できませんでした。関係に変更が加えられると、関連する外部キープロパティがnull値に設定されている外部キーがnull値をサポートしていない場合は、新しい関係を定義するか、外部キープロパティに別の非null値を割り当てるか、無関係のオブジェクトを削除する必要があります。」
私が理解していることから、1つ以上の外部キープロパティがnull許容でないため、関係を変更できませんでした。問題は、EntityFrameworkが仮想ICollectionを処理する方法にある可能性があります。
ただし、スキャフォールドリポジトリパターンを使用するときにソリューションを実装する方法がよくわかりません。Save()メソッドParentObjectRepositoryクラスを編集する必要がありますか?
実は、EFにこれを理解させる方法があるに違いないと思います。EFチームが「おそらく誰も外部キー制約のあるオブジェクトのコレクションを使用していないので、それをサポートできない」と考えていたのかわかりません。
追加されたコードを更新
[HttpPost]
public ActionResult Edit(int id, FormCollection formCollection)
{
var eventRepository = new MagnetEventRepository();
var original = eventRepository.Find(id);
UpdateModel(original);
eventRepository.Save();
return RedirectToAction("Details", "Home", new { slug = original.Slug });
}
public void Save()
{
context.SaveChanges();
}
その他のコード:
public class MagnetEvent
{
public virtual int Id { get; set; }
[Required]
public virtual string Name { get; set; }
[Required]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm}")]
[DataType(DataType.DateTime)]
public virtual DateTime? StartDate { get; set; }
public virtual string Description { get; set; }
[StringLength(100)]
public virtual string Slug { get; set; }
public virtual int MaximumCapacity { get; set; }
[DataType(DataType.Currency)]
public virtual int TicketPrice { get; set; }
public virtual int LocationId { get; set; }
public virtual Location Location { get; set; }
public virtual Collection<Ticket> Tickets { get; set; }
public virtual Collection<AttendeeInformationField> CaptureAttendeeInformationFields { get; set; }
public virtual int CustomerId { get; set; }
[Required]
public virtual CUSTOMER Customer { get; set; }
}
Save()メソッドは、上記のクラスのスキャフォールドであるMagnetEventRepositoryからのものです。
別の更新 では、AttendeeInformationFieldのMagnetEventIdをnull許容整数に変更することでエラーを正常に削除しました。データベースを調べると、何が悪いのかが正確にわかります。
値が「E-mail」のAttendeeInformationFieldが1つあるとします。私がMagnetEventを編集すると、AttendeeInformationFieldはMagnetEventIdをnullに更新してから、正しいMagnetEventIdとValueで新しい投稿を追加します。
代わりに、AttendeeInformationFieldの投稿が更新された方がいいと思います。