Используя LINQ-to-SQL, я хотел бы автоматически создавать дочерние записи при вставке родительской сущности. По сути, имитирует работу триггера SQL Insert, но внутри кода, чтобы можно было выполнить дополнительную обработку.
Родитель связан с дочерним элементом, но, похоже, я не могу просто добавить новые дочерние записи во время SubmitChanges()
.
DataContext.
Например,
public partial class Parent
{
partial void OnValidate(System.Data.Linq.ChangeAction action)
{
if(action == System.Data.Linq.ChangeAction.Insert)
{
Child c = new Child();
... set properties ...
this.Childs.Add(c);
}
}
}
Это было бы идеально, но, к сожалению, вновь созданная запись Child
не вставляется в базу данных. Имеет смысл, поскольку DataContext имеет список объектов / операторов и, вероятно, не любит добавление новых элементов в середине.
Аналогично, перехват функции partial void InsertParent(Parent instance)
в DataContext и попытка добавить запись Child
дает тот же результат - никаких ошибок, но ничего не добавлено в базу данных.
Есть ли способ получить такое поведение без добавления кода на уровень представления?
Обновление:
Обе функции OnValidate()
и InsertParent()
вызываются из функции DataContext SubmitChanges()
. Я подозреваю, что это связано с тем, что я пытаюсь сделать - DataContext не позволит вставлять дополнительные объекты (например, через InsertOnSubmit()
), пока он находится в процессе отправки существующих изменений в базу данных.
В идеале я хотел бы сохранить все в одной транзакции, чтобы в случае каких-либо ошибок во время вставки / обновления ничего не изменилось в базе данных. Поэтому я пытаюсь имитировать функциональность SQL Trigger, позволяя автоматически вставлять дочерние записи через один вызов функции DataContext SubmitChanges()
.