未设置为对象实例的DbSet对象引用

本文关键字:DbSet 对象引用 实例 对象 设置 | 更新日期: 2023-09-27 18:12:47

我正在尝试为任何数据提供程序/orm提供通用存储库的通用3层应用程序。我只是重写了代码,并卡住了对象引用的错误没有设置为对象的实例,而试图在DbSet中采取行动。我完全糊涂了。至少把我推到正确的方向。

Repository.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)
    {
    }
}

未设置为对象实例的DbSet对象引用

我建议您更改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;