1

クラスがあります

public partial class Advertisement
{
    public int AdvertisementId { get; set; }
    public string Description { get; set; }
    public City CityIdFrom { get; set; }
    public City CityIdTo { get; set; }
    public int Weight { get; set; }
}

これは、テーブルAdvertisementsを表します。クラスCityについても同じことが言えます

public class City
{
    public Int32 CityId { get; set; }
    public string Name { get; set; }
}

これで、View1Controllerという名前のViewControllerができました。

DbConnection db = new DbConnection();

public ActionResult Index()
{
    var query = from item in db.Advertisements.AsEnumerable() select item;

    return View(query);
}

そして最後にView1.cshtmlファイルがあります

@model IEnumerable<MvcApplication1.Models.Advertisement>

@{
    ViewBag.Title = "View1";
}

<h2>View1</h2>

<table>
@foreach(var item in Model)
{
    <tr>
        <td>@item.Description</td>
        <td>@item.CityIdFrom</td>
    </tr>
}
</table>

SQLプロファイラーを調べたところ、生成されたクエリは

SELECT 
[Extent1].[AdvertisementId] AS [AdvertisementId], 
[Extent1].[Description] AS [Description], 
[Extent1].[Weight] AS [Weight], 
[Extent1].[CityIdFrom_CityId] AS [CityIdFrom_CityId], 
[Extent1].[CityIdTo_CityId] AS [CityIdTo_CityId]
FROM [dbo].[Advertisements] AS [Extent1]

そして、私が得たクエリを実行します:

2   None    5000    1   2
3   Test    1000    3   4

ただし、クエリがヒットすると、何らかの理由でCityIdFromとCityIdToの両方がnullになります。したがって、結果テーブルは次のようになります。

None 
Test 

期待される代わりに

None 1
Test 3

私は何が間違っているのですか?

4

2 に答える 2

2

CityFromとCityToのインクルードを追加する必要があるか、これらの参照エンティティを仮想にすることができます。オプション1(含める)は、選択されたn + 1の問題を回避するため、ORM間で共通です。

var query = db.Advertisements.Include("CityIdFrom").Include("CityIdTo").AsEnumerable();
return View(query);
于 2012-11-12T02:32:41.223 に答える
1

エンティティフレームワークを使用している場合は、プロパティを仮想化する必要があります。

public partial class Advertisement
{
    public int AdvertisementId { get; set; }
    public string Description { get; set; }
    public virtual City CityIdFrom { get; set; }
    public virtual City CityIdTo { get; set; }
    public int Weight { get; set; }
}
于 2012-11-12T02:48:46.227 に答える