Newtonsoft.Json.JsonSerializationException:从"Castle.Proxies.SalonProxy"上的"MyEntity"获取值时出错



大家好,我有Asp。. Net Core Web API项目,使用Entity Framework Core 6.0和Postgresql作为数据库

我配置了实体和它们的关系。一切都很好,但只有通用存储库设计模式有问题

如果我只使用context.Products.ToList(),它工作完美。但每当我使用通用存储库设计模式。我得到了一个错误。但是有一件有趣的事情。每当我使用断点仅10秒或更长时间,并在10秒后保持它,就不会出现错误。一切都很顺利。是否存在异步问题,我从未使用过它?

误差输入图片描述

Newtonsoft.Json。从。获取值时出错"座位"在"Castle.Proxies.SalonProxy"上。

——比;系统。InvalidOperationException:产生了一个警告错误"Microsoft.EntityFrameworkCore.Infrastructure.LazyLoadOnDisposedContextWarning":我们尝试惰性加载导航"座椅"。SalonProxy后关联的DbContext被处理。这个例外可以是通过传递事件ID抑制或记录"CoreEventId。lazyloadondisposedcontextwarwarning '到'ConfigureWarnings'方法在'DbContext. 'OnConfiguring"或"AddDbContext"。

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; }
}

我解决了这个问题

参数包含实体关系

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)

但我意识到这种方式效率不高。通用存储库基础应该使用基本实体。这是我的看法

相关内容

最新更新