1

私は次の2つのモデルを持っています

[DataContract]
public class Event
{       
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public Place Place { get; set; }
}

[DataContract]
public class Place
{
    [Key]
    public string ID { get; set; }
    public string Name { get; set; }
}

およびデータコンテキストクラス:

public class myDB: DbContext
{
    public DbSet<Event> Events { get; set; }
    public DbSet<Place> Places { get; set; }
}

たとえば、次のコードを実行します

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        Foo();
    }

    private void Foo()
    {
        var db = new myDB();

        var place = new Place
                        {
                            ID = "{59E0F90C-03DB-453C-8C9E-4747957ED37E}",
                            Name = "Home",
                        };

        db.Places.Add(place);
        db.SaveChanges();

        var @event = new Event
        {
            Name = "Test",
            Place = place,
            TimeFrame = new TimeFrame() {StartTime = DateTime.Now, EndTime = DateTime.Now }
        };
        db.Events.Add(@event);
        db.SaveChanges();
        var eventIndex = @event.ID;

        var ev = db.Events.Find(@eventIndex);
        var evPlace = ev.Place;

        var pl = db.Places.Find("{59E0F90C-03DB-453C-8C9E-4747957ED37E}");
    }

すべてが正常に機能し、evPlaceはdbに追加したばかりのオブジェクトであり、plもnullではありません。

しかし、コントローラーから次のコードを実行しようとすると、5は新しいイベントオブジェクトのIDです。

var ev = _db.Events.Find(5);
var evPlace = ev.Place;

var pl = _db.Places.Find("{59E0F90C-03DB-453C-8C9E-4747957ED37E}");

plとevはnullではありませんが、ev.Placeはnullです(evPlace)

なぜですか?

4

1 に答える 1

2

この問題は、主キーがaであるstringかどうかとは関係ありません。通常、EntityFrameworkはナビゲーションプロパティを自動的にロードしません。これを明示的に指定する必要があります。

var ev = db.Events.Include(e => e.Place).SingleOrDefault(e => e.ID == 5);

Placeまたは:プロパティをvirtual...として宣言した場合

public virtual Place Place { get; set; }

... EFは、このプロパティの遅延読み込みPlaceを有効にし、コードでアクセスするとすぐにデータベースから読み込みます。その場合、コード例は機能します。遅延読み込みはデータベースへの2番目のクエリ/ラウンドトリップにつながるのに対し、積極的な読み込み(Include)は単一のクエリでイベントと場所の両方を読み込むことに注意してください。

関連するエンティティの読み込みについて詳しくは、こちらをご覧ください。

于 2012-07-21T14:59:37.293 に答える