NBear中的Entity因为是以接口形式定义的,所以,它可以很方便的支持实体继承关系,甚至支持多根继承。也就是从2个以上的基类(接口)继承。
NBear支持两种类型的非常自然的继承关系映射:单表继承体系方式和一实体一表方式。
让我们先看第一个例子:
我们可以看到,在上例中,我们定义了两个基实体Parent和AnotherParent,Child实体同时从两个基类继承。注意,代码中加粗的行,如果多个不同的基接口包含相同名称的属性,代码会编译失败,此时,需要像这样使用new关键字来避免编译失败。[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; } }
再注意,在这个例子中,我们和数据库表是如何对应的呢?
这里,我们采用的是,单表继承体系方式。也就是说,用一张单独的表,存储整个继承体系的类。注意每个实体都映射到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; } }