【问题标题】:ServiceStack.OrmLite inheritance mappingServiceStack.OrmLite 继承映射
【发布时间】:2017-08-30 07:27:33
【问题描述】:

ServiceStack.OrmLite 是否支持继承映射?

如 DevExpress XPO:Inheritance Mapping 或 nHibernate Inheritance

例如(c#):

public abstract class EventBase
{
   public string Name { get;set; }
}
public class NormalEvent: EventBase
{
   public string A { get;set; }
}
public class SuperDuppaEvent:EventBase
{
   public string B { get;set; }
}

在数据库中存在一个表“EventBase”,其中包含来自“NormalEvent”、“SuperDuppaEvent”和“EventBase”的所有列/属性。

在文档中存在“AliasAttribute”,但它不起作用。

【问题讨论】:

    标签: c# .net ormlite-servicestack


    【解决方案1】:

    No OrmLite 不支持继承映射。 OrmLite 的核心期望是每个 POCO 与它所代表的 RDBMS 表 1:1 映射。因此,默认情况下,您的每个类都将映射到具有相同名称的 RDBMS 表:

    • NormalEvent > 正常事件表
    • SuperDuppaEvent > SuperDuppaEvent 表

    如果您想要不同的行为,您需要将 POCO 类与您希望它在数据库中的布局方式进行 1:1 映射,例如:

    class NormalEvent
    {
        public string A { get; set; }
        public int EventBaseId { get; set; }
    }
    

    【讨论】:

    • 因此,如果所有 15 个数据库表都有 Id、RowVersion、CreatedBy、ModifiedBy,那么您必须在 POCO 中重新定义这 4 个字段 15 次?如果有一种方法可以定义一个基类并让所有 15 个基类都继承自它并自动获取公共字段,那就太好了。还有其他方法可以实现吗?
    • @Bitfiddler 您可以照常使用继承,但字段包含在每个 POCOs 表中,即它们没有映射到不同的表。 POCO 总是 1:1 映射到它们的基础表,如果你想要不同表中的公共字段,你需要相应地定义单独的表和关系,没有到不同表的神奇映射。
    • 哦,太好了。那么我所追求的应该是默认的吗?具有所有 POCO 共有的 4 个字段的“TransactionalBase”应该分别映射到每个单独的表吗?好的,是时候试试这个了:-)
    猜你喜欢
    • 1970-01-01
    • 2017-12-07
    • 2011-11-22
    • 2010-11-25
    • 1970-01-01
    • 2013-04-19
    • 2017-03-13
    • 2020-01-09
    相关资源
    最近更新 更多