C# EF:了解要包含/加载哪个对象的自定义逻辑
我有以下课程:C# EF:了解要包含/加载哪个对象的自定义逻辑,c#,entity-framework,.net-core,code-first,C#,Entity Framework,.net Core,Code First,我有以下课程: public class A { public Guid Id { get; set; } = Guid.NewGuid(); public ICollection<B> AllB { get; set; } = new List<B>(); public B Current { get; set; } // other properties } public class B { public int Id
public class A
{
public Guid Id { get; set; } = Guid.NewGuid();
public ICollection<B> AllB { get; set; } = new List<B>();
public B Current { get; set; }
// other properties
}
public class B
{
public int Id { get; set; }
public Guid AId { get; set; }
public A A { get; set; }
// other properties
}
// in the DBContext
public DbSet<A> AllA { get; set; }
public IQueryable<A> AWithAllB
{
get
{
return AllA.Include(c => c.AllB);
}
}
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<A>().ToTable("A");
builder.Entity<A>().HasKey(h => h.Id);
builder.Entity<B>().ToTable("B");
builder.Entity<B>().HasKey(h => h.Id);
builder.Entity<B>().HasOne(h => h.A).WithMany().HasForeignKey(r => r.AId);
}
公共A类
{
公共Guid Id{get;set;}=Guid.NewGuid();
public ICollection AllB{get;set;}=new List();
公共B当前{get;set;}
//其他属性
}
公共B级
{
公共int Id{get;set;}
公共Guid辅助{get;set;}
公共A{get;set;}
//其他属性
}
//在DBContext中
公共DbSet AllA{get;set;}
公共图书馆
{
得到
{
返回AllA.Include(c=>c.AllB);
}
}
模型创建时受保护的覆盖无效(ModelBuilder)
{
builder.Entity().ToTable(“A”);
builder.Entity().HasKey(h=>h.Id);
builder.Entity().ToTable(“B”);
builder.Entity().HasKey(h=>h.Id);
builder.Entity().HasOne(h=>h.A).WithMany().HasForeignKey(r=>r.AId);
}
基本上,一个A有多个B
我所挣扎的是A的流动性。
我希望填充此属性,但使用自定义逻辑查找要加载的B
在我的例子中,它将是具有我希望作为当前Id的最高Id的B的实例。这种逻辑在未来将会改变
如何实现这一点?我认为您在某种程度上“违反”了关注点的分离。EF是一个“映射”框架,用于简单地从数据库获取数据。因此,把你的“业务”逻辑放在那里会使事情复杂化,正如你已经注意到的那样。如果您只是从数据库中检索数据,然后根据您的logicWell“映射”集合和当前属性,这将更加简单,在某些情况下甚至更有效。我同意,但在这种情况下,大多数情况下,我真的不希望加载所有B对象只是为了检索其中一个。“我真的不想只为了检索其中一个而加载所有B对象”使用延迟加载。@AnilKumar我不知道延迟加载如何改变这里的任何东西。他说我应该加载所有对象,然后过滤掉我想要的对象。无论我是否延迟加载,我都会加载它们(对于A的这个实例)。我支持@Fabio。最好将此逻辑置于EF模型之外。添加一个
Current
属性,但不要在映射中对其进行任何操作。让它由执行检索的任何进程(服务、控制器等)填充。