一对多关系的数据插入(主从表事务)

一对多关系的数据插入(主从表事务)


表结构设计

书架表(bookcase)— 主表

CREATE TABLE bookcase (
    id INT IDENTITY(1,1) PRIMARY KEY,
    name NVARCHAR(50) NULL,
    number NVARCHAR(20) NULL
);Code language: PHP (php)

书籍表(book)— 从表

CREATE TABLE book (
    id INT IDENTITY(1,1) PRIMARY KEY,
    name NVARCHAR(50) NULL,
    bcid INT NULL,
    CONSTRAINT FK_book_bookcase FOREIGN KEY (bcid) REFERENCES bookcase(id)
);Code language: PHP (php)

示例数据:

INSERT INTO bookcase (name, number) VALUES ('语文', '09');
INSERT INTO bookcase (name, number) VALUES ('数学', '10');

INSERT INTO book (name, bcid) VALUES ('歌曲', 1);
INSERT INTO book (name, bcid) VALUES ('得到', 1);
INSERT INTO book (name, bcid) VALUES ('几何', 2);Code language: JavaScript (javascript)

核心机制

前提条件:​ 只有在数据库中设置了外键约束,LINQ to SQL 才会在主表实体中自动生成一个从表的集合字段:

public EntitySet<book> book { get; set; }Code language: JavaScript (javascript)

这个 EntitySet<book> 就是主表与从表之间的导航属性,通过它可以直接操作关联的从表记录。


完整插入代码

class Program
{
    static void Main(string[] args)
    {
        using (var db = new DataClasses1DataContext())
        {
            // 1. 创建主表记录
            var bc = new bookcase();
            bc.name = "语文";
            bc.number = "09";
            db.bookcase.InsertOnSubmit(bc);

            // 2. 创建从表记录,通过导航属性关联到主表
            var b = new book();
            b.name = "歌曲";
            bc.book.Add(b);

            var b2 = new book();
            b2.name = "得到";
            bc.book.Add(b2);

            // 3. 一次性提交(事务)
            try
            {
                db.SubmitChanges();
                // 提交成功后,bc.id 和 b.id / b2.id 已自动回填
                Console.WriteLine($"书架ID: {bc.id}");
                Console.WriteLine($"书籍1 ID: {b.id}, 外键bcid: {b.bcid}");
                Console.WriteLine($"书籍2 ID: {b2.id}, 外键bcid: {b2.bcid}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"插入失败: {ex.Message}");
            }
        }
    }
}Code language: JavaScript (javascript)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注