3

.NET 4.5 で Entity Framework 5 を使用する ASP.NET MVC 4 アプリケーションがあります。私が抱えている問題は、フロントエンドで作成された切り離されたエンティティを挿入すると、遅延読み込みが機能しないことです。

追加(または更新)するコードは次のとおりです。

public static int PersistMergeEntity(EntityTwo entityTwo)
{
    int entityId;

    using (var _db = new EntityDb())
    {
        if (_db.EntityTwo.Any(e => e.EntityTwoId == entityTwo.EntityTwoId))
        {
            _db.Entry(entityTwo).State = EntityState.Modified;
        }
        else
        {
            _db.EntityTwo.Add(entityTwo);
        }

        _db.SaveChanges();

        //_db.Entry(entityTwo).Reference(e => e.EntityOne).Load();
        entityId = entityTwo.EntityOne.EntityId;
    }

    EntityBo.UpdateData(entityId);

    return entityTwo.EntityTwoId;
}

ここに私のエンティティがあります:

public class EntityTwo
{
    [Key]
    [ForeignKey("EntityOne")]
    public int EntityTwoId { get; set; }

    public Decimal NbValue { get; set; }

    public virtual EntityOne EntityOne { get; set; }
}

public class EntityOne
{
    [Key]
    [ForeignKey("EntityTwo")]
    public int EntityOneId { get; set; }

    [ForeignKey("Entity")]
    public int EntityId { get; set; }

    public CsMonthDomain CsMonth { get; set; }
    public int NbYear { get; set; }
    public Decimal NbValue { get; set; }

    public virtual Entity Entity { get; set; }
    public virtual EntityTwo EntityTwo { get; set; }
}

AndEntityは、更新または追加するたびに計算する必要がある別のエンティティですEntityTwo

コメント行のコメントを外すと、コードが機能します。しかし、それがそこに示されている方法である場合、遅延読み込みは機能せず、null例外が発生します。遅延読み込みが に設定されてtrueおり、ナビゲーション プロパティを明示的に読み込むと機能するため、エンティティはおそらく正しいと思われます。

名前については申し訳ありませんが、残念ながら実際のコードを投稿することはできません;(

4

1 に答える 1

3

メソッドに渡すのは(ほとんどの場合)動的プロキシではないため、遅延読み込みが機能しませんentityTwo。遅延読み込みを機能させるために必要です。インスタンスは、おそらく を使用してメソッドの外で作成されますentityTwo = new EntityTwo();。エンティティのプロキシを作成するには、利用可能なコンテキスト インスタンスが必要です。

entityTwo = _db.EntityTwos.Create();

私の意見では、明示的な読み込み (コメント行) を使用することが、この状況での最良の解決策です。遅延読み込みのように、ナビゲーション プロパティごとに 1 回データベースにクエリを実行するのと同じコストがかかります。さらに、遅延読み込みよりも、関連するエンティティから必要なプロパティのみを選択できるという追加の利点があります。次に例を示します。

entityId = _db.Entry(entityTwo).Reference(eTwo => eTwo.EntityOne).Query()
    .Select(eOne => eOne.EntityId)
    .Single();
于 2013-07-16T19:46:46.537 に答える