1

任意のデータ プロバイダー/orm 用の汎用リポジトリを使用して、ユニバーサル 3 層アプリケーションを作成しようとしています。コードを書き直したところ、DbSet でアクションを作成しようとしているときに、オブジェクト参照がオブジェクトのインスタンスに設定されていないというエラーが発生しました。私は完全に混乱しています..少なくとも正しい方向に私を微調整してください。

リポジトリ.cs

 public class Repository<T> : IRepository<T> where T : class
{

    public IUnitOfWork UnitOfWork { get; set; }
    private IDbSet<T> _objectset;

    private IDbSet<T> DbSet
    {
        get { return _objectset ?? (_objectset = UnitOfWork.Context.Set<T>()); }
    }
public List<T> GetAll()
    {
        try
        {
            return DbSet.ToList();
        }
        catch (Exception)
        {
            throw new Exception("Error in repository while attempts get all elements");
        }
    }
}

EFUnitOfWork.cs

 public class EfUnitOfWork : IUnitOfWork
{
    public EfUnitOfWork()
    {
        Context = new AppContext();
    }

    public DbContext Context { get; set; }

    public void Commit()
    {
        Context.SaveChanges();
    }

    public bool LazyLoadingEnabled
    {
        get { return Context.Configuration.LazyLoadingEnabled; }
        set { Context.Configuration.LazyLoadingEnabled = value; }
    }

    public void Dispose()
    {
        Context.Dispose();
    }
}

AppContext.cs

 public class AppContext : DbContext, IDbContext
{
    public AppContext()
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<AppContext,            Configuration>());
        Configuration.ProxyCreationEnabled = false;
    }

    public DbSet<Logic> Logics { get; set; }

    public DbSet<Category> Categories { get; set; }

    public new IDbSet<TEntity> Set<TEntity>() where TEntity : class
    {
        return base.Set<TEntity>();
    }
}

IDbContext.cs

public interface IDbContext
{
    IDbSet<TEntity> Set<TEntity>() where TEntity : class;
    int SaveChanges();
    void Dispose();
}

Configuration.cs

class Configuration : DbMigrationsConfiguration<AppContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
    }

    protected override void Seed(AppContext context)
    {

    }
}
4

1 に答える 1

1

それなしでは有効ではないため、コンストラクターでRepository期待するように変更することをお勧めします。IUnitOfWork

public class Repository<T> : IRepository<T> where T : class
{
    private readonly IUnitOfWork _unitOfWork;
    public Repository(IUnitOfWork unitOfWork;)
    {
        _unitOfWork = unitOfWork;
    }
    public IUnitOfWork UnitOfWork { get { return _unitOfWork; } }
}

IDbContext実装として定義する必要があります(およびインターフェイス定義からメソッドIDisposableを削除します)Dispose

public interface IDbContext : IDisposable
{
    IDbSet<TEntity> Set<TEntity>() where TEntity : class;
    int SaveChanges();
}

の次のコード行はAppContext、遅延読み込みがプロキシによって実装されているため、遅延読み込みを無効にする効果があります。

Configuration.ProxyCreationEnabled = false;
于 2013-05-09T19:19:49.113 に答える