2

EF 5を使用していて、遅延読み込みを有効にしています。データベースからエンティティを取得すると、完全に機能します。

これが私の問題です。データベース操作を実行するための汎用リポジトリがあります。

    public int Update(T t) //Update method implemented at repository layer
    {
        dbSet.Attach(t);
        context.Entry(t).State = EntityState.Modified;
        return context.SaveChanges();
    }

    public T Update(T t, int id) //This Method calls the above method to
    {
        if (Update(t) > 0)
        {
            //Now entity is updated so retrieve the entity from the database.
            return Get(id); //This line of code doesn't return entity with reference. It does return the updated entity.
        }
        return null;
    }

これで、主キーを使用してエンティティをクエリして更新されたエンティティを取得すると、更新されたエンティティが表示されますが、参照プロパティはありません。例外がスローされるため、ここで遅延読み込みを使用することはできません。

エンティティを更新した後、dbSet.Localに更新されたエンティティがあることに気付きました。そのため、更新されたエンティティを取得する前にクリアしようとしましたが、うまくいきませんでした。また、コンテキストを介してエンティティをリロードしようとしましたが、ナビゲーションプロパティがリロードされません。ジェネリックリポジトリを使用しているため、Referenceプロパティを使用できません。私が達成できる唯一の方法は、コンテキストとdbsetの新しいインスタンスを破棄して作成することです。

リレーショナルプロパティが入力された更新済みエンティティを返したい。誰かが良い解決策を持っていますか?

4

2 に答える 2

1

遅延読み込みを有効にしました

POCOエンティティを添付しています

私はあなたのコメントから、あなたのアプリケーションのどこかであなたがそのようにあなたのエンティティをインスタンス化していると仮定しています、new MyEntity()そしてそれはプロキシPOCOではないのでそのような遅延読み込みは機能しません。

遅延読み込みが有効になっていることを考慮して、実行しようとしていることを実行する最も簡単な方法は、プロキシPOCOを使用することです。つまり、以下を使用して、エンティティをインスタンス化します。

MyEntity entity = MyContext.MyEntities.Create();

遅延読み込みが機能するはずです。これを実行したくない場合、またはこれが機能しない場合は、データベースから既存のエンティティを(動的プロキシとして)プルし、POCOからデータを入力するのが最善のオプションです。したがって、リポジトリの更新方法では、次のようになります。

編集

dbへのラウンドトリップなしでこれを行うことも可能であることに注意する必要があります。コメントを参照してください。

public T Update(T poco)
{
  //get the entity from db
  T proxyPoco = context.Set<T>().Find(id);

  //alternatively just create the proxy, set the id and attach.
  //no db retrieval.
  //T proxyPoco = context.Set<T>.Create();
  //proxyPoco.Id = poco.Id;
  //context.Set<T>.Attach(proxyPoco);

  if(proxyPoco == null) 
  {
    //throw an exception or handle case where the entity is not found.
    //unecessary if using alternative above.
  }
  else 
  {
    //set the proxy poco values using your original poco
    context.Entry<T>(proxyPoco).CurrentValues.SetValues(poco);
  }
  context.SaveChanges();
  return proxyPoco;
}

プロキシを返すため、POCO遅延読み込みは機能するはずです。その他のあまり望ましくないオプションは次のとおりです。

  1. コンテキストを破棄し、エンティティを再度取得します。
  2. リフレクションを使用して、そのエンティティの参照とコレクションを明示的にロードします。
于 2013-01-15T04:22:06.770 に答える
1

SaveChangesはを返しますint。エンティティを元に戻したい場合は、次のことを試してください。

public T Update(T t)
{
    dbSet.Attach(t);
    context.Entry(t).State = EntityState.Modified;
    context.SaveChanges();
    return t;
}
于 2013-01-06T22:42:13.683 に答える