什么是解决此问题的正确方法: 假设我有一个对象表:
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继承,但是我的控制表将非常庞大,其中包含许多空列,因为根据其类型,控制具有许多不同的属性。
答案 0 :(得分:0)
听起来您想基于IControl
和ControlType
动态查询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
。