根据其EF核心类型获取相关对象

时间:2020-10-23 13:46:46

标签: .net .net-core entity-framework-core

什么是解决此问题的正确方法: 假设我有一个对象表:

public class Object
{
public Guid Id { get; set; }
public ControlType Type { get; set; }
public Guid ControlId { get; set; }
public IControl Control { get; set; }
}

和IControl是由10个不同的控制对象实现的接口。它们的类型由ControlType枚举描述。我想将它们存储在不同的表中,并且在查询我的对象时,我希望根据其ID将我的对象作为特定于Control的表的IControl Control包含在内。

我知道我可以使用TPH继承,但是我的控制表将非常庞大,其中包含许多空列,因为根据其类型,控制具有许多不同的属性。

1 个答案:

答案 0 :(得分:0)

听起来您想基于IControlControlType动态查询ControlId

不添加验证(空检查等),这是我做的一种方法:

//assuming the names of your ControlType Enums exactly match the string name of their actual Type. 
//assume your Object is as follows
// var obj = new Object() {id = a8, Type = Ctrl8, ControlId = e3}
//context is the DbContext of EF.

//need to reflect on the EF Context and find the correct type 
var controlType = context.Model.FindEntityType(Enum.GetName(typeof(ControlType), obj.Type)))?.ClrType;

//search the context for the Control
var myCtrl = context.Find(controlType , obj.ControlId)

如果您想要一个松散的关系(没有FK约束),EF可以让您找到只需要一些额外步骤的对象:

  • 通过反射查找实际的Type
  • DbContext.Find与相应的Type一起使用,并搜索Id

不太确定您的ControlType到底是什么,因此此代码可能需要调整。我只是使用string来存储松散链接表的类型。这样,我每次添加或删除POCO时都不必调整Enum