我有一个类似于这样的类结构:
public abstract class Device
{
public int DeviceId { get; set; }
//Additional Properties
}
public class DeviceA : Device
{
//Specific Behaviour
}
public class DeviceB : Device
{
//Specific Behaviour
}
Run Code Online (Sandbox Code Playgroud)
我需要检索设备列表,或者单个设备,它被实例化为适当的派生类型(基于DB中设备记录中的类型值).也就是说,Device
对象集合应该包含许多具有不同类型的对象,所有这些对象都是从中派生出来的Device
.
我已经通过以下方式实现了这一点,但是对它感觉不对.
public static IEnumerable<Device> AllDevices()
{
using (var connection = CreateConnection())
{
connection.Open();
return connection.Query<dynamic>("SELECT * FROM Device").Select<dynamic, Device>(d =>
{
Device device = null;
if (d.DeviceTypeID == 1)
device = new DeviceA();
else if (d.DeviceTypeID == 2)
device = new …
Run Code Online (Sandbox Code Playgroud) 默认情况下,EF6 将为每个层次结构表 (TPH) 映射一个基本抽象类及其派生类。
EF Core 不再遵循此逻辑,并要求选择派生类。文档指出:
按照约定,上下文中的 DbSet 属性中公开的类型将作为实体包含在模型中。还包括 OnModelCreating 方法中指定的实体类型,以及通过递归探索其他已发现实体类型的导航属性找到的任何类型。
如果您有一些子类型,那么使用这种方法并不难,因为您可以将它们添加为 DbSet,或者为每个子类型添加 HasDiscriminator().HasValue() ,映射如下:
builder.HasDiscriminator()
.HasValue<CommaSymbolRule>("CommaSymbolRule")
.HasValue<DashSymbolRule>("DashSymbolRule")
.HasValue<IsNumericSymbolRule>("IsNumericSymbolRule")
.HasValue<IsPunctuationSymbolRule>("IsPunctuationSymbolRule")
.HasValue<PeriodSymbolRule>("PeriodSymbolRule")
Run Code Online (Sandbox Code Playgroud)
在某些情况下,这是次优的,因为您可能有许多派生类。就我而言,我有一个规则引擎,并且不想单独映射每个规则。
有没有办法在 EF Core Table Per Hierarchy 场景中自动映射基类的子类型,而无需手动添加它们?
c# entity-framework discriminator entity-framework-core .net-core
我有个问题.如何转换IDictionary<string, object>
为课程?以及创建用户帐户.
WebSecurity.CreateUserAndAccount(UserName, Password, new { eny = 0 , eny2 = "sas"});
Run Code Online (Sandbox Code Playgroud)
我有
void Create(String name, IDictionary<string, object> values)) {...}
Run Code Online (Sandbox Code Playgroud)
和班级
class test {
String name,
int eny,
int eny2
}
Run Code Online (Sandbox Code Playgroud)
我想用字典中的数据进行对象测试.