Вы сами не генерируете Identity или не устанавливаете значения ID для FK.
Итак, все упрощается (потому что ваша структура не очень понятна)
Если ваша таблица Person выглядит следующим образом:
Id int IDENTITY(1,1)
Name nvarchar(MAX)
MotherId int NULL (FK -> Person.Id)
FatherId int NULL (FK -> Person.Id)
Тогда ваш класс в LINQ долженвыглядеть следующим образом:
public class Person
{
public int Id { get; set;}
public string Name { get; set;}
public Person Mother { get; set;}
public int? MotherId { get; set;}
public Person Father { get; set;}
public int? FatherId { get; set;}
}
При вставке вы можете сделать следующее:
var mother = new Person { Name = "April Smith" };
var father = new Person { Name = "Bob Smith" };
var child = new Person { Name = "Charlie Smith", Mother = mother, Father = father};
db.People.InsertOnSubmit(mother);
db.People.InsertOnSubmit(father);
db.People.InsertOnSubmit(child);
LINQ-to-SQL должен знать, чтобы получить сгенерированные идентификаторы для матери и отца и вставить ихв записи ребенка.
Если вы пытаетесь использовать самоссылочную или кольцевую ссылку, то нет способа сделать это в одной транзакции, о которой я знаю.
Вы должны будете сначала вставить свои записи (и оставить их ссылки изначально нулевыми), а затем вернуться и обновить ссылки позже.