1

Entity Framework を使い始めたところ、問題が発生しました。

データベースに 2 つのテーブルがあるとします。ID とパスワードを含む Agent と呼ばれるテーブルと、エージェントに関する詳細情報を含む AgentDetail と呼ばれる別のテーブルです。ただし、すべての Agent レコードに対応する AgentDetail レコードが存在しない場合があります。

これらの 2 つのテーブルを表すこれらの 2 つのクラスがあります。

public class Agent
{
    public string AgentId { get; set; }
    public string Password { get; set; }
    public virtual AgentDetail AgentDetail { get; set; }
}

public class AgentDetail
{
    public string AgentDetailId { get; set; }
    public string AgentName { get; set; }
    public string Postcode { get; set; }
}

EF を使用すると、データベースにデータを追加できます。両方のテーブルに対応するレコードがあれば、データを取得することもできます。

        var agents = from a in context.Agents
                     select a;

        return View(agents.ToList());

ただし、そのレコードが AgentDetail テーブルに存在しない場合、AgentDetail 内の値をレンダリングすると、ビューで NullReferenceException が発生します。

AgentDetail レコードがないため、これは当然のことです。

私の質問は、テーブルにレコードが存在しない場合に、空の値を持つ AgentDetail を作成するように EF を取得する方法です。

LINQ クエリに空の子オブジェクトを追加できますか?

        var agents = (from a in rb.Agents
                      select new
                      {
                          AgentId = a.AgentId,
                          Password = a.Password,
                          AgentDetail = a.AgentDetail == null ? new AgentDetail() : a.AgentDetail,
                      }).ToList();

(ただし、次のメッセージが表示されるため、上記は機能しません:

エンティティまたは複合型 'Models.AgentDetail' は、LINQ to Entities クエリでは構築できません)。

4

1 に答える 1

3

「空の」アイテムを人為的に追加することは本当に望ましくありません。これは、(後ろに曲がることなく) そのオブジェクトがデータベースに永続化されようとするためです。

最善の方法は、サブデータの部分ビューを分割し、nullそこから値を読み取ろうとする前に確認することです。

于 2012-09-19T20:14:20.443 に答える