【问题标题】:Getting every related entity in Entity Framework 6.2在 Entity Framework 6.2 中获取每个相关实体
【发布时间】:2019-08-05 07:12:34
【问题描述】:
public class Service
{
    public int Id { get; set; }
    public string Title { get; set; }
}

public class Store
{
    public int Id { get; set; }
    public virtual Service Service { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public virtual Service Service { get; set; }
}

public class Operation
{
    public int Id { get; set; }
    public virtual Service Service { get; set; }
}

我有一个在其他实体中使用的Service 实体。我想获取所有使用Service 的实体。

我的意思是获取使用 Service 的实体列表,如下所示:

public virtual Service Service { get; set; }

在实体框架中可以吗?

【问题讨论】:

  • 为什么不将其他实体作为导航属性添加到Service
  • 因为没关系。我不想要数据。我只想获取所有使用 Service 的实体。使用服务的“dbset”列表
  • 嗯,现在的问题根本不在于实体框架。你寻求的是反思。
  • @ilkerkaran 可能不是真的,请参阅下面的评论。
  • @GertArnold,实际上他可以访问上下文属性并枚举它们的类型等。实体框架只是OP询问类关系和访问类型时的一个细节示例。

标签: c# entity-framework relationship


【解决方案1】:

你可以通过反射来做到这一点。近似代码,其中Assembly.GetExecutingAssembly() 可以替换为适当的程序集/程序集:

var types = Assembly.GetExecutingAssembly().GetTypes()
            .Where(x => x.GetProperties().Any(y => y.PropertyType == typeof(Service)))
            .ToList();

(instance.GetType().GetProperties().Where(y => y.PropertyType == typeof(DbSet<Service>))
.First().GetValue(instance) as DbSet<Service>).Add(newItem);

【讨论】:

  • 回答问题。我认为是正确的。但是如何将类型列表转换为 dbset 呢?我需要使用类型来添加或删除。
  • 您可以从某个实例中获取DbSet&lt;Service&gt; 属性,将其转换为目标类型并调用适当的方法,所有这些也都通过反射实现。查看更新的答案。
  • 感谢您重播我想将实例转换为相关列表。 foreach (var e in types) { var entity = e as DbSet; // 实体是商店或产品或操作,...不是服务 }
  • 请注意,这会找到所有 Service 类型的属性,即使它们是非实体类型和未映射的属性。这可能是个问题,如果是这样,则有必要使用 EF 的元数据来查找正确的属性。
  • @GertArnold,在这种情况下,我们可以添加额外的提示 - 例如,将所有对特定命名空间感兴趣的类。
【解决方案2】:

添加导航 ServiceId 并使用它。 您可能正在简化代码,但我会这样做:

public class Service
{
    public int Id { get; set; }
    public string Title { get; set; }
    public List<ObjectUsingService> MyServiceUsers {get; set;
}

public ObjectUsingService
{
    public int? ServiceId {get; set;}
    public virtual Service Service { get; set; }
}

public class Store : ObjectUsingService
{
    public int Id { get; set; }
}

//...

然后从另一端查询EF:

_context.Services.Include(s => s.MyServiceUsers).Where(s => s.MyServiceUsers.Any())

在 EF 中可以实现一级继承,但要小心,如果过度使用它可能会变得混乱。不以这种方式连接它们的问题还不错,您只需分别询问每个实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 2016-10-10
    • 2014-07-22
    • 2020-08-06
    • 2021-01-15
    • 2022-01-19
    相关资源
    最近更新 更多