Я пытаюсь добиться чего-то похожего на то, что описано в этом старом посте SO , которое так и не получило правильного ответа. Я пытаюсь найти способ делегировать установку первичного ключа вновь вставленных объектов частичным методам DataContext InsertX (), когда вызывается метод SubmitChanges (). По сути, это делает генерацию первичного ключа ленивым и лучше отделяет его от бизнес-логики.
public class Foo
{
public int Id
{
get ...
set ... // usual linq to sql bodies
}
}
...
// provide an implementation for the insert overload
public class DB : DataContext
{
partial void InsertFoo(Foo instance)
{
instance.Id = GetNextFooId();
ExecuteDynamicInsert(instance);
}
}
В настоящее время происходит сбой при вставке более одного объекта с DuplicateKeyException, возможно, потому что LINQ to SQL пытается получить доступ к первичным ключам, чтобы отличить экземпляры друг от друга? Я попытался переопределить Equals и GetHashCode, чтобы решить эту проблему, но без кубиков.
Исключение не содержит подробных сведений о том, какой именно класс вызывает проблему, и нет способа зарегистрировать внутреннюю операцию DataContext, поэтому я буду признателен за любые предложения!
Если есть какое-то событие перед обновлением, которое запускается в какой-то момент, я мог бы подключиться к этому, но перегрузка DataContext Insert - единственный способ, которым я мог видеть. Возможно, LINQ to SQL просто не может выразить этот шаблон, поскольку для отражения PropertyChanging / PropertyChanged потребуется различие InsertingFoo / InsertedFoo.