技术开发 频道

Nbear接口式实体定义之——自定义实体属性+实体多根继承

    实体多根继承

    NBear中的Entity因为是以接口形式定义的,所以,它可以很方便的支持实体继承关系,甚至支持多根继承。也就是从2个以上的基类(接口)继承。

    NBear支持两种类型的非常自然的继承关系映射:单表继承体系方式和一实体一表方式。

    让我们先看第一个例子:
[Table("AllInOneTable")] public interface Parent : IEntity { [PrimaryKey] int ID { get; } string Name { get; set; } } [Table("AllInOneTable")] public interface AnotherParent : IEntity { [PrimaryKey] int ID { get; } int Age { get; set; } } [Table("AllInOneTable")] public interface Child : Parent, AnotherParent { [PrimaryKey] new int ID { get; set; } DateTime Birthday { get; set; } }
    我们可以看到,在上例中,我们定义了两个基实体Parent和AnotherParent,Child实体同时从两个基类继承。注意,代码中加粗的行,如果多个不同的基接口包含相同名称的属性,代码会编译失败,此时,需要像这样使用new关键字来避免编译失败。

    再注意,在这个例子中,我们和数据库表是如何对应的呢?

    这里,我们采用的是,单表继承体系方式。也就是说,用一张单独的表,存储整个继承体系的类。注意每个实体都映射到AllInOneTable这个表。

    那么,是不是只能使用单表继承体系方式来映射继承关系的实体呢?当然不是(见是比较推荐,因为,该方案相对比较方便灵活)。

    我们也可以采用一实体一表方式。代码如下:
[Table("ParentTable")] public interface Parent : IEntity { [PrimaryKey] int ID { get; } string Name { get; set; } } [Table("AnotherParentTable")] public interface AnotherParent : IEntity { [PrimaryKey] int ID { get; } int Age { get; set; } } [Table("ChildTable")] public interface Child : Parent, AnotherParent { [PrimaryKey] new int ID { get; set; } DateTime Birthday { get; set; } }
    这种方案下,每个实体对应一张表,每张表包含冗余的父类的数据。
0
相关文章