gpt4 book ai didi

c# - 在 Linq-to-SQL 中更新记录及其关联关系的一般最佳实践

转载 作者:行者123 更新时间:2023-11-30 16:35:53 24 4
gpt4 key购买 nike

我有一个关于在 Linq-to-SQL 中更新记录的非常普遍的问题。假设,在我的数据模型中,我有一个基本记录(表 - 人)与一组类别(表 - 类别)具有 m:m 关系。因此,我有一个关联表 (PersonCategory),它具有指向 PersonID 和 CategoryID 的外键。

当我想更新一个 Person 时,我可能有新的 PersonCategory 记录要添加并且可能想要删除其他 PersonCategory 记录。做这样的事情的最佳做法是什么?我是否要删除 Person.RelatedPersonCategories 中的所有记录,然后添加新记录? LINQ-to-SQL 是否足够智能以协商实际添加、编辑或删除 PersonCategory 表中的哪些记录(基于潜在地查看其外键)?

感谢您的帮助!

最佳答案

只要有DataContext的事件实例类来跟踪更改,LINQ to SQL 将愉快地在关联表中插入/更新/删除行,每次修改模型中映射关系的集合中的对象时,并且DataContext.SubmitChanges()方法被调用。

例如:

using (var db = new DataContext())
{
var person = db.Persons.Where(p => p.Name == "Foo").SingleOrDefault();

if (person != null)
{
// Inserts a new row in the 'PersonCategory' table
// associated to the current 'Person'
// and to the 'Category' with name 'Employee'
person.PersonCategories.Add(new PersonCategory() { CategoryName = "Employee" });

// Updates the 'CategoryName' column in the first row
// of the 'PersonCategory' table associated to the current 'Person'
person.PersonCategories(0).CategoryName = "Consultant";

db.SubmitChanges();
}
}

如果您在“断开连接”模式下更改模型对象,情况会有所不同,也就是说,最初用于创建这些对象的 DataContext 实例不再存在。< br/>
在这种情况下,当具有修改后的集合的对象附加到具有 Table(TEntity).Attach 的新 DataContext 时,对关联表的插入/删除操作将正常工作方法,后跟 DataContext.SubmitChanges() .

但是,对集合中任何现有对象的修改不会自动应用到关联表中。为此,您必须手动调用 Table(TEntity).Attach集合中每个对象的方法。
这是来自 MSDN documentation 的引述:

When a new entity is attached, deferred loaders for any child collections (for example, EntitySet collections of entities from associated tables) are initialized. When SubmitChanges is called, members of the child collections are put into an Unmodified state. To update members of a child collection, you must explicitly call Attach and specify that entity.

这是一个具体的例子:

// The 'Person' object has been detached
// from the originating 'DataContext', which is now disposed
person.PersonCategories.Add(new PersonCategory() { CategoryName = "Employee" });
person.PersonCategories(0).CategoryName = "Consultant";

using (var db = new DataContext())
{
// Will detect added and deleted objects
// in the 'PersonCategory' collection
db.Person.Attach(person);

// Required to detect and modifications
// to existing objects in the 'PersonCategory' collection
foreach (var personCategory in person.PersonCategories)
{
db.PersonCategory.Attach(personCategory);
}

db.SubmitChanges();
}

关于c# - 在 Linq-to-SQL 中更新记录及其关联关系的一般最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1456438/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com