Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF:了解要包含/加载哪个对象的自定义逻辑_C#_Entity Framework_.net Core_Code First - Fatal编程技术网

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
属性,但不要在映射中对其进行任何操作。让它由执行检索的任何进程(服务、控制器等)填充。