大家好,我有使用 Entity Framework Core 6.0 和 Postgresql 作為資料庫的 Asp.Net Core Web API 專案
我配置了我的物體及其關系。一切都很好,但是通用存盤庫設計模式中唯一的問題
如果我使用 just context.Products.ToList(),它會完美運行。但是每當我將它與通用存盤庫設計模式一起使用時。我有一個錯誤。但是有一個有趣的事情。每當我只使用 10 秒甚至更長時間的斷點并在 10 秒后保持它,就沒有錯誤。一切都很完美。是否有異步問題,我從未使用過它?
在此處輸入影像描述時出錯
Newtonsoft.Json.JsonSerializationException:從“Castle.Proxies.SalonProxy”上的“席位”獲取值時出錯。
---> System.InvalidOperationException:為警告“Microsoft.EntityFrameworkCore.Infrastructure.LazyLoadOnDisposedContextWarning”生成錯誤:在關聯的 DbContext 被處置后,嘗試延遲加載導航“Seats.SalonProxy”。通過將事件 ID 'CoreEventId.LazyLoadOnDisposedContextWarning' 傳遞給 'DbContext.OnConfiguring' 或 'AddDbContext' 中的 'ConfigureWarnings' 方法,可以抑制或記錄此例外。
public class EfEntityRepositoryBase<TEntity, TContext> : IEntityRepository<TEntity>
where TEntity : class, IEntity, new()
where TContext : DbContext, new()
{
public TEntity Add(TEntity entity)
{
using (TContext context = new TContext())
{
var addedEntity = context.Entry(entity);
addedEntity.State = EntityState.Added;
context.SaveChanges();
return addedEntity.Entity;
}
}
public void Delete(TEntity entity)
{
using (TContext context = new TContext())
{
var deletedEntity = context.Entry(entity);
deletedEntity.State = EntityState.Deleted;
context.SaveChanges();
}
}
public TEntity Get(Expression<Func<TEntity, bool>> filter)
{
using (TContext context = new TContext())
{
var result = context.Set<TEntity>().SingleOrDefault(filter);
return result;
}
}
public List<TEntity> GetAll(Expression<Func<TEntity, bool>> filter = null)
{
using (TContext context = new TContext())
{
var result = filter == null
? context.Set<TEntity>().ToList()
: context.Set<TEntity>().Where(filter).ToList();
return result;
}
}
}
}
我的沙龍物體
public class Salon : IEntity
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string SalonNumber { get; set; }
public virtual List<Seat> Seats { get; set; }
public virtual List<Ticket> Tickets { get; set; }
}
我的座位物體
public class Seat : IEntity
{
[Key]
public int Id { get; set; }
public int SeatNumber { get; set; }
public int SalonId { get; set; }
public virtual Salon Salon { get; set; }
}
MyDbContext
public class AppDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLazyLoadingProxies().ConfigureWarnings(warnings => warnings.Ignore(CoreEventId.DetachedLazyLoadingWarning))
.UseNpgsql("Server=localhost;Database=BiletsgoDB;Port=5432;Username=postgres;Password=123456");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Ticket>().HasOne(t => t.Category).WithMany(b => b.Tickets).HasForeignKey(t => t.CategoryId);
modelBuilder.Entity<Ticket>().HasOne(t => t.Salon).WithMany(b => b.Tickets).HasForeignKey(t => t.SalonId);
modelBuilder.Entity<Seat>().HasOne(t => t.Salon).WithMany(b => b.Seats).HasForeignKey(t => t.SalonId);
modelBuilder.Entity<TicketFile>().HasOne(t => t.Ticket).WithMany(b => b.TicketFiles).HasForeignKey(t => t.TicketId);
}
public DbSet<Ticket> Tickets { get; set; }
public DbSet<TicketFile> TicketFiles { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Seat> Seats { get; set; }
public DbSet<Salon> Salons { get; set; }
}
uj5u.com熱心網友回復:
我解決了問題
params 包括我們的物體關系
public List<TEntity> GetAll(params Expression<Func<TEntity, object>>[] including)
{
using (TContext context = new TContext())
{
var include = context.Set<TEntity>().AsQueryable();
including.ToList().ForEach(item =>
{
include = include.Include(item);
});
return include.ToList();
}
}
我從我的業務層運行這個方法
_salonDal.GetAll(t => t.Seats,t => t.Tickets)
但我意識到這種方式效率不高。通用存盤庫基礎應使用基礎物體。這是我的意見
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/483895.html
