ServiceStack.OrmLite:选择在运行时确定类型的POCO(继承)

问题描述 投票:1回答:1

当我在设计时不知道POCO的确切类型,而在运行时只得到Type时,如何使用ServiceStack中的OrmLite正确地反序列化POCO?

所以,类似这样:

// Returns the object and can be cast to the correct subobject
public BaseClass ReadObject(Type typeOfObject, int id) 
{
     using (var db = _dbFactory.Open())
     {
         baseObject = db.Select<BaseClass>(typeOfObject, id);  // need something here...
         return baseObject;
     }
}

...
BaseClass bc = ReadObject(someType, 3); // someType = Customer for example

...
class BaseClass { ... }
class Actor : BaseClass { ... }
class Customer : Actor { ... }
class Operator : Actor { ... }

我坚持使用Actor和Customer,但是当我读回它们时,我基本上只有一个Type,可能还有主键。 .Select<>不起作用,因为我需要在运行时知道类型。

我发现这个:Create (and select from) a table dynamically using servicestack ormlite

而且,如果我理解正确,那么在设计时获取类型未知的POCO的唯一方法是执行手动SQL语句,如答案所示:

var modelDef = employeeType.GetModelMetadata();
var tableName = db.GetDialectProvider().GetQuotedTableName(modelDef);
var sql = $"SELECT * FROM {tableName}";

var results = db.Select<List<object>>(sql);
var results = db.Select<Dictionary<string,object>>(sql);
var results = db.Select<dynamic>(sql);

但是,这不会创建顶部列出的任何类;我需要将其类型转换为BaseClass,但它当然应该是正确的对象(因此,“ Customer”,“ Operator”等)。

我该如何实现?

[[(我还指出,Mythz曾说过在持久化数据时使用继承是一个坏主意,他提议“拉平”层次结构。但是,我会伸出脖子说在处理面向对象时语言,继承和多态性是不可避免的,那里没有99.9%的编码人员可以消除;-))]]

当我在设计时不知道POCO的确切类型,但是在运行时只得到Type时,如何使用ServiceStack中的OrmLite正确反序列化POCO。因此,如下所示://返回...
inheritance servicestack ormlite-servicestack
1个回答
2
投票
在OrmLite中使用运行时类型的支持非常有限。
© www.soinside.com 2019 - 2024. All rights reserved.