未设置为对象实例的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)
{
}
}
我建议您更改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;