NinjectでのEntity Frameworkキャッシュの問題を使用するMVC3ツール

asp.net-mvc entity-framework ninject
NinjectでのEntity Frameworkキャッシュの問題を使用するMVC3ツール

データベース内のデータを手動で変更するときにいくつかの問題を示している新しいMVC 3アプリケーションがあります。

このツールはまだ開発中であり、たまにユーザーのteamIdを変更したいことがあります。 そうする場合、Web開発サーバーを強制終了して再度実行する必要があります。そうしないと、クエリで新しいteamIdが選択されません。 IISにツールを公開するときにも同じことが言えます。データベース上の何かを変更した場合は、「bin」フォルダーを再度コピーするか、アプリケーションを停止して再実行する必要があります。

アプリケーション自体からデータを変更しても、問題はありません。

これは私のNinjectがどのように見えるかです:

public class NinjectControllerFactory : DefaultControllerFactory
{
    private IKernel kernel = new StandardKernel(new TrackerServices());

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
            return null;
        return (IController)kernel.Get(controllerType);
    }

    private class TrackerServices : NinjectModule
    {
        public override void Load()
        {
            var context = new TrackerEntities();

            Bind().To().WithConstructorArgument("context", context);
        }
    }
}

私のインターフェース:

public interface IUserRepository : IRepository
{
    User GetByName(string name);
}

私の実装:

public User GetByName(string login)
{
    var userLogin = _misc.GetUsername(login);
    return _context.Users.Where(x => x.Login == userLogin).Single();
}

そして、私のインデックスアクション

public ActionResult Index()
{
    var teamid = (int)_users.GetByName("myName").TeamId;

これは以前に起こったことはありませんが、このツールはNinjectで使用する最初のツールです。 私の問題とリポジトリの使用との間に関係があるのだろうか?

  1  0


ベストアンサー

この問題を作成するために組み合わされている2つの問題があります。

  1. コンテキストを作成した方法により、コンテキストが効果的になります
    シングルトン。

  2. Entity Frameworkは、新しいバージョンを自動的にチェックしません
    コンテキストがすでに追跡しているエンティティ。

これを解決するために、このバインディングを使用して、リクエストごとにリポジトリを再作成することをお勧めします(これはかなり軽量なので、これによるパフォーマンスの大幅な低下はありません)。

Bind()。To()。InRequestScope();

Ninjectは `TrackerEntities`コンテキストを自動的に作成できるはずですが、そうでない場合(または明確にしたい場合)、次のバインディングを使用できます:

Bind()。ToSelf()。InRequestScope();(デフォルトの一時的なスコープは大丈夫なので、ここでは `InRequestScope`は必要ありません)。

(ObjectContext.Refresh() `を使用して)エンティティを強制的に更新することもできますが、エンティティごとに明示的に更新する必要があるため、おそらく素晴らしいアイデアではありません。

3


タイトルとURLをコピーしました