1

整数配列 (複数選択 MVC ListBoxFor 要素から入力) をドメイン オブジェクトの ICollection プロパティにマップするように AutoMapper を構成するにはどうすればよいですか? 基本的に、ドメイン オブジェクトの PatientTypes プロパティと ProviderTypes プロパティを、ユーザーがリスト ボックスで選択したものに設定し、オブジェクトをデータベースに保存したいと考えています。

ドメイン オブジェクト

public class Document
{
    public int ID { get; set; }

    public virtual ICollection<PatientType> PatientTypes { get; set; }
    public virtual ICollection<ProviderType> ProviderTypes { get; set; }
}

モデルを見る

public class DocumentEditModel
{
    public int ID { get; set; }

    [DisplayName("Patient Type")]
    public int[] SelectedPatientTypes { get; set; }
    public SelectList PatientTypeList { get; set; }

    [DisplayName("Provider Type")]
    public int[] SelectedProviderTypes { get; set; }
    public SelectList ProviderTypeList { get; set; }
}

コントローラ

public virtual ActionResult Edit(int pid)
{
    var model = Mapper.Map<DocumentEditModel>(_documentRepository.Find(pid));
    model.ProviderTypeList = new SelectList(_providerTypeRepository.All.OrderBy(x => x.Value), "ID", "Value");
    model.PatientTypeList = new SelectList(_patientTypeRepository.All.OrderBy(x => x.Value), "ID", "Value");

    return View(model);
}

[HttpPost]
public virtual ActionResult Edit(DocumentEditModel model)
{
    if (ModelState.IsValid)
    {
        var document = Mapper.Map(model, _documentRepository.Find(model.ID));
        document.DateModified = DateTime.Now;

        _documentRepository.InsertOrUpdate(document);
        _documentRepository.Save();

        return null;
    }

    model.ProviderTypeList = new SelectList(_providerTypeRepository.All.OrderBy(x => x.Value), "ID", "Value");
    model.PatientTypeList = new SelectList(_patientTypeRepository.All.OrderBy(x => x.Value), "ID", "Value");

    return View(model);
}

AutoMapper 構成

Mapper.CreateMap<Document, DocumentEditModel>();
Mapper.CreateMap<DocumentEditModel, Document>();
4

1 に答える 1

1

関連付けは多対多であるため、データベースにジャンクション レコードを作成するだけで済みます。これを行う便利な方法は、コレクションをクリアして項目を追加することです。Document.PatientTypes例として見てみましょう:

var document = Mapper.Map(model, _documentRepository.Find(model.ID));
document.DateModified = DateTime.Now;

// Set the new associatins with PatientTypes
document.PatientTypes.Clear();
foreach(var pt in model.PatientTypeList.Select(id => new PatientType{Id = id}))
{
    document.PatientTypes.Add(pt);
}

_documentRepository.InsertOrUpdate(document);
_documentRepository.Save();

(私はプロパティ名に関していくつかの仮定をしなければなりませんでした)

ここで何が起こるかというと、ジャンクション テーブル内の既存のレコードがDocumentPatientTypes新しいレコード セットに置き換えられます。これは、いわゆるスタブ エンティティ( new PatientTypes. EF が必要とするのは、新しいジャンクション レコードを作成するための Id 値だけであるため、最初にデータベースから実際のものを取得する必要はありません。

ご覧のとおり、私は黙って Automapper を方程式から外しました。整数のリストを にマップするのはやり過ぎPatientTypeです。これSelectは非常に簡単で、少し経験を積めば、スタブ エンティティ パターンをすぐに認識できます。これは、そうでなければ、Mapper.Mapステートメントによって隠されます。

于 2013-04-08T18:54:22.427 に答える