採用「表巢結構」:基類對應主表 Users,子類對應從表 Employees,共享主鍵 ID。
CREATE TABLE Users (
ID INT IDENTITY(1,1) PRIMARY KEY,
LoginName VARCHAR(50) NOT NULL,
Password VARCHAR(20) NOT NULL
);
CREATE TABLE Employees (
ID INT PRIMARY KEY,
Salary MONEY
);
[ActiveRecord("Users"), JoinedBase]
public class User : ActiveRecordBase
{
[PrimaryKey(PrimaryKeyType.Identity, "ID")]
public int ID { get; set; }
[Property("LoginName")]
public string Name { get; set; }
[Property("Password")]
public string Password { get; set; }
}
[JoinedBase] 標記此為繼承層級的根實體。
[ActiveRecord("Employees")]
public class Employee : User
{
[JoinedKey("ID")] // 取代 PrimaryKey,指向共享主鍵
public int EID { get; set; }
[Property]
public decimal Salary { get; set; }
}
[JoinedKey("ID")] 告知 AR 此屬性對應從表的主鍵,同時也是外鍵關聯回 Users。
ActiveRecordStarter.Initialize(source, typeof(Employee), typeof(User));
using (var scope = new TransactionScope())
{
var emp = new Employee
{
Name = "jailu",
Password = "123456789",
Salary = 1000
};
emp.Save(); // 會同時寫入 Users 與 Employees
scope.VoteCommit();
}
此模式適用於「是一種」關係且子類擁有獨有欄位的場景,避免單表繼承的稀疏欄位問題。