1

次の 2 つのモデルがあるとします。

public class Card
{
    public int CardId { get; set; }

    public Media Media { get; set; }
}

public class Media
{
    public int MediaId { get; set; }

    [Required]
    public string FileName { get; set; }
}

そして、次のコントローラーメソッド:

[HttpPost]
public ActionResult Create(Card card)
{
    db.Media.Attach(card.Media);

    ModelState.Remove("Media.FileName");

    if (ModelState.IsValid)
    {
        db.Cards.Add(card);                
        db.SaveChanges();
    }

    return JsonNetSerializedResult(card);
}

新しいカードを作成したいのですが、それを既存の Media オブジェクトに関連付けます。「Controller/Create」に POST し、既存のメディア レコードの ID を含む「Media.MediaId」パラメータを含めて、EF に関連付けを作成させます。

ただし、SaveChanges() が呼び出された後、Card インスタンスで更新される唯一のプロパティは CardId です。また、Media.FileName を取得し、そのプロパティを Card インスタンスに設定する必要があります。

更新されたカード データを返し、データをコミットする関連するメディア データも返すことを EF に伝える一般的な方法はありますか?

4

1 に答える 1

1

混乱を引き起こしている可能性があるのは、Entity Model を として使用しているという事実ですViewModel

Controller が受け取った情報、またはビューのモデルとして使用される情報を表す実際のViewModel クラスを作成することをお勧めします。エンティティ モデルをそのまま使用しない。余分な作業のように思えますが、UI が何を管理し、エンティティがどのようにモデル化されるかをより詳細に制御できます。

その場合、UI に表示されるフィールドのプロパティと、Media 要素の id を持つ、NewCardModelまたは単にのようなものがあるでしょう。CardModel

次に、手動でCardインスタンスを作成し、情報を入力する必要があります ( automapperが非常に役立ちます) 。変更を保存する前にMedia、インスタンスを ID で検索し、そのインスタンスを新しいインスタンスに関連付ける必要があります。Card

この SO の回答は、ViewModels を使用することの長所と短所をさらに明らかにする可能性があります: https://stackoverflow.com/a/10928437/1373170

于 2012-10-18T00:24:41.600 に答える