一对多关系的数据插入(主从表事务)
表结构设计
书架表(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)
Previous: 使用实体数组进行批量连表查询
Next: 一对一关系配置与延迟加载机制