5

person と address の 2 つのモデルからのデータを必要とするビューモデルがあります。

モデル:

public class Person
{
   public int Id { get; set; }
   public string Name { get; set; }
   public int Age { get; set; }
   public int Gender { get; set; }
}

public class Address
{
   public int Id { get; set; }
   public string Street { get; set; }
   public int Zip { get; set; }
   public int PersonId {get; set; }
}

ビューモデルはそのままです

public class PersonAddViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Street { get; set; }
}

ビューモデルにデータを取得してビューに渡す方法をいくつか試しました。複数のレコードが返されて表示されます。

私の最新の方法は、ビューモデルを次のように設定することです:

private AppContexts db = new AppContexts();
public ActionResult ListPeople()
{
    var model = new PersonAddViewModel();
    var people = db.Persons;
    foreach(Person p in people)
    {
        Address address = db.Addresses.SingleOrDefault(a => a.PersonId == p.Id)
        model.Id = p.Id;
        model.Name = p.Name;
        model.Street = address.Street;
    }
    return View(model.ToList());
}

「EntityCommandExecutionException was unhandled by user code.」の Address address = db... 行でエラーが発生します。

ビューモデルに複数のレコードを入力してビューに渡すにはどうすればよいですか?

最終的解決:

private AppContexts db = new AppContexts();
private AppContexts dbt = new AppContexts();
public ActionResult ListPeople()
{
    List<PersonAddViewModel> list = new List<PersonAddViewModel>();
    var people = db.Persons;
    foreach(Person p in people)
    {
        PersonAddViewModel model = new PersonAddViewModel();
        Address address = dbt.Addresses.SingleOrDefault(a => a.PersonId == p.Id)
        model.Id = p.Id;
        model.Name = p.Name;
        model.Street = address.Street;
    }
    return View(list);
}
4

2 に答える 2

5

まず、EntityCommandExecutionException エラーは、エンティティ コンテキストの定義またはエンティティ自体のエラーを示します。これは、データベースが指定された方法とは異なることが判明したため、例外をスローしています。あなたはその問題を理解する必要があります。

次に、これを行う適切な方法に関して、コンテキストが正しく構成されていれば、示したコードが機能するはずです。ただし、関連するすべてのレコードを取得し、他の Where 句パラメーターを指定しない限り、Navigational プロパティを使用することをお勧めします。ナビゲーション プロパティは次のようになります。

public class Person
{
   public int Id { get; set; }
   public string Name { get; set; }
   public int Age { get; set; }
   public int Gender { get; set; }

   public virtual Address Address { get; set; }
   // or possibly, if you want more than one address per person
   public virtual ICollection<Address> Addresses { get; set; }
}

public class Address
{
   public int Id { get; set; }
   public string Street { get; set; }
   public int Zip { get; set; }
   public int PersonId { get; set; }

   public virtual Person Person { get; set; }
}

次に、次のように言うだけです。

public ActionResult ListPeople()
{
    var model = (from p in db.Persons // .Includes("Addresses") here?
                select new PersonAddViewModel() {
                    Id = p.Id,
                    Name = p.Name,
                    Street = p.Address.Street,
                    // or if collection
                    Street2 = p.Addresses.Select(a => a.Street).FirstOrDefault()
                });

    return View(model.ToList());
}
于 2013-04-18T05:50:08.253 に答える