0

モデルを更新しようとしていますが、「操作に失敗しました。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の投稿が更新された方がいいと思います。

4

4 に答える 4

0

イベントオブジェクトのコードを追加できますか。あなたがオリジナルと呼ぶもの。

UpdateModelが関連するオブジェクトの情報を変更する可能性がありますが、その場合は適切ではありません。すべてのコードを見ることができませんが、これについてはよくわかりません。

私はUptadeModelを使用せず、代わりにinputmodelまたはMVCモデルをインパラメーターとして使用し、ロードされた元のオブジェクトに変更を手動でマップすることを好みます。

もう1つの問題は、eventRepository.Save();かどうかがわからないことです。

本当にSaveShagesをしますか?しますか?別のメソッドでコンテキストコードを設定できます保存?

于 2012-04-16T07:50:46.983 に答える
0

例外として、関連付けられたコレクションまたは他の関連付けられたオブジェクトが有効な ID 値を見つけることができないように継ぎ目があります。

関連するオブジェクトを Eager-load していますか? 顧客のように?

于 2012-04-16T08:19:31.167 に答える
0

注意すべきことの 1 つは、FK が null 可能ではないという事実から推測されるため、Customer に [Required] を付けるべきではないということです。Required は、モデルに FK がない場合にのみ、ナビゲーション プロパティで使用する必要があります。

この問題を診断するには、オブジェクトを読み込んでデバッガーで確認してください。locationId と CustomerId の両方にゼロ以外の値があることを期待してください。

于 2012-04-16T09:53:54.837 に答える
0

問題の解決策を見つけました。UpdateModel と ICollection を含むモデルに関しては、ASP.NET MVC のバグ (?) のようです。

解決策は、このブログ投稿で説明されているように、デフォルトの動作をオーバーライドすることです: http://www.codetuning.net/blog/post/Binding-Model-Graphs-with-ASPNETMVC.aspx

更新 解決策が見つかりました! 上記は、コレクション内の既存のアイテムを更新する場合にのみ機能しました。これを解決するには、新しい AttendeeInformationFields を手動で確認して追加する必要があります。このような:

[HttpPost]
public ActionResult Edit(int id, MagnetEvent magnetEvent)
{
    var eventRepository = new MagnetEventRepository();
    var original = eventRepository.Find(id);
    UpdateModel(original);
    foreach (var attendeeInformationField in magnetEvent.CaptureAttendeeInformationFields)
    {
        var attendeeInformationFieldId = attendeeInformationField.Id;
        if (original.CaptureAttendeeInformationFields.AsQueryable().Where(ai => ai.Id == attendeeInformationFieldId).Count() == 0)
        {
            original.CaptureAttendeeInformationFields.Add(attendeeInformationField);
        }
    }
    eventRepository.Save();
}

変更された DefaultModelBinder と共に、これは実際に編集と追加の両方で機能します。今のところ削除は試していません。

それでも、これを行う簡単な方法があることを願っています。非常に基本的なタスクを実行するには、多くのコーディングが必要なようです。

于 2012-04-17T06:58:07.473 に答える