首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Castle ActiveRecord 多對多映射:HasAndBelongsToMany 完整指南

     編輯:關於.NET

領域模型

Student 與 Subject 為多對多關係:一位學生可修多門課,一門課可被多位學生選修。需引入關聯表 Student_Subject。

資料庫腳本

CREATE TABLE Student (
    ID INT IDENTITY(1,1) PRIMARY KEY,
    StudentName VARCHAR(50) NOT NULL
);

CREATE TABLE Subject (
    ID INT IDENTITY(1,1) PRIMARY KEY,
    SubjectName VARCHAR(50) NOT NULL
);

CREATE TABLE Student_Subject (
    StudentID INT NOT NULL,
    SubjectID INT NOT NULL
);

關鍵屬性:HasAndBelongsToMany

三個必要子屬性:

  • Table:關聯表名稱
  • ColumnKey:關聯表中指向「本實體」的外鍵欄位
  • ColumnRef:關聯表中指向「另一實體」的外鍵欄位

Student 端

[HasAndBelongsToMany(typeof(Subject),
    Table = "Student_Subject",
    ColumnKey = "StudentID",
    ColumnRef = "SubjectID")]
public IList SubjectList { get; set; } = new ArrayList();

Subject 端

[HasAndBelongsToMany(typeof(Student),
    Table = "Student_Subject",
    ColumnKey = "SubjectID",
    ColumnRef = "StudentID")]
public IList StudentList { get; set; } = new ArrayList();

常用進階屬性

  • Cascade:None / All / SaveUpdate / Delete
  • Inverse:指定哪一端負責關係維護(建議一端設 true)
  • Lazy:是否延遲載入集合

新增關聯資料

using (var scope = new TransactionScope())
{
    var student = new Student { Name = "jailu" };
    for (int i = 0; i < 5; i++)
    {
        var sub = new Subject { Name = "Subject " + i };
        sub.Create(); // 必須先持久化 Subject
        student.SubjectList.Add(sub);
    }
    student.Save(); // 級聯寫入關聯表
    scope.VoteCommit();
}

注意:加入集合的對象必須已存在資料庫(已有主鍵),否則儲存學生時會失敗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved