本文以雙魚座同學的再說繼承關系一文中提到的一組三元繼承關聯關系為基礎。
首先,分別實現本人的ORM中的繼承關系映射全解一文中提到的三種實體繼承體系到關系數據庫的映射方案實例。
接著,使用接口分離以上繼承體系中的實體類中的相同概念,對該繼承體系進行重構,並同樣給出對重構後的繼承體系的三種到關系數據庫的映射方案實例。
全部實例代碼基於NBear的接口式實體定義方式實現。
1. 背景
首先,給出雙魚座同學原文中的三元繼承關聯關系的等價接口定義。見下圖1:
2. 對圖1-1的ORM映射
2.1 單表繼承體系
采用單表繼承體系映射時,我們用一個AllInOne表包含所有實體的所有字段,並用一個FilterMark過濾標志,區分該條紀錄的類型,注意只有所有的User,包括抽象的User和所有的UserGroup是可以查詢的,其余接口僅僅用於概念抽象。
代碼1
[Table(IsView = true)]
public interface PrivilegeOwner : IEntity
{
[PrimaryKey]
int Id { get; }
string Name { get; set; }
}
[Table("AllInOne", AdditionalWhere = "FilterMark <= 20", IsView = true)]
public interface User : PrivilegeOwner
{
}
[Table("AllInOne", AdditionalInsert = "FilterMark = 1", AdditionalWhere = "FilterMark = 1")]
public interface LocalUser : User
{
string LoginId { get; set; }
string Password { get; set; }
}
[Table("AllInOne", AdditionalInsert = "FilterMark = 2", AdditionalWhere = "FilterMark = 2")]
public interface AgentUser : User
{
string LoginId { get; set; }
}
[Table("AllInOne", AdditionalInsert = "FilterMark = 3", AdditionalWhere = "FilterMark = 3")]
public interface GhostUser : User
{
}
[Table("AllInOne", AdditionalInsert = "FilterMark = 21", AdditionalWhere = "FilterMark = 21")]
public interface UserGroup : PrivilegeOwner
{
string Comment { get; set; }
}