2

DI には EF4.x、Code First、Castle Windsor を使用しています。私の問題: 新しく挿入されたエンティティを取得するときに、特定の仮想プロパティが null に戻ってきます。私はこれに慣れていないので、すべてがどのように機能するかについての私の無知を許してください。非常に単純な例は次のようなものです。

public class Address
{
    public int AddressID { get; set; }
    public string Street { get; set; }
    public int ProvinceID { get; set; }
    public virtual Province { get; set; }
    etc....
}

public class Province
{
    public int ProvinceID { get; set; }
    public string Name { get; set; }
    public string Abbreviation { get; set; }
    public int DisplayOrder { get; set; }
    etc...
}

そのため、SaveChanges() の後、データベースでレコードが正しく作成されていることを確認できますが、Address エンティティをロードする後続のページ リクエストでは、ProvinceID は正しく設定されていますが、仮想 Province は null です。再構築後、問題はありません。私は何を間違っていますか?ティア

より詳しい情報:

リポジトリと作業単位のパターンで DbContext を使用しています。一般的な CRUD メソッドをすべて含む抽象 EF RepositoryBase クラスがあります。一般的な GET メソッドの例を次に示します。

  public T Get(params object[] keyValues)
  {
     return _dbSet.Find(keyValues);
  }

  public IQueryable<T> Get(Func<T, bool> filter)
  {
     return _dbSet.Where(filter).AsQueryable();
  }

  public IQueryable<T> GetAll()
  {
     return _dbSet.AsQueryable();
  }

_dbSet は次のように設定されます。

_dbSet = ((DbContext)_context).Set<T>(); // _context is of IDbContext

たぶん、ここで何かが奇妙な問題を引き起こしているのでしょうか?

4

2 に答える 2

2

したがって、ナビゲーション プロパティの読み込み、遅延読み込み、および明示的な読み込みに関して、EF には実際には 2 つのオプションがあります。私の経験では、重大なパフォーマンスの問題を引き起こすのがはるかに難しくなるため、明示的な読み込みの方がはるかに優れています。

ここで読むことができるナビゲーション プロパティに関する記事を書きました。

明示的なナビゲーション プロパティの読み込みを使用するには、.Include ステートメントを使用して、各クエリで読み込むプロパティを指定します。

遅延読み込みを使用する場合、コンテキスト内のすべてのnav プロパティを仮想装飾する必要があり、プロパティで get を呼び出すとデータベースがクエリされます。

于 2012-08-13T06:08:19.627 に答える
0

次の回避策を使用します: エンティティをデタッチして再度ロードします

public T Reload<T>(T entity) where T : class, IEntityId
{
    ((IObjectContextAdapter)_dbContext).ObjectContext.Detach(entity);
    return _dbContext.Set<T>().FirstOrDefault(x => x.Id == entity.Id);
}
于 2015-03-21T04:11:08.077 に答える