Как вставить в две связанные таблицы в одном контексте (как получить значение идентификатора перед SaveChanges)? - PullRequest
1 голос
/ 13 ноября 2010
Header:
Id => identity, primary key 
...other columns...

Detail:
Id => identity, primary key
HeaderId => foreign key
...other columns...       

public bool CreateHeader(Header header, IEnumerable<Detail> details)
{
    using (TransactionScope tran = new TransactionScope())
    using (TemplateEntities ctx = new TemplateEntities())
    {
        try
        {
            HeaderRepository ihRep = new HeaderRepository(ctx);
            DetailRepository idRep = new DetailRepository(ctx);
            ihRep.Add(header);
            // header.Id is still 0
            foreach (Detail detail in details)
            {
                detail.HeaderId = header.Id;
                idRep.Add(detail);
            }
            ctx.SaveChanges();
            tran.Complete();
            return true;
        }
        catch
        {
            return false;
        }
    }
}

1 Ответ

1 голос
/ 13 ноября 2010

Вы пытались использовать свойство Navigation, а не свойство FK?

Попробуйте изменить тело вашего foreach на:

detail.Header = header;

Это должно сообщить EF об отношенияхдолжен управлять этим оттуда IIRC.Если ваш idRep.Add выполняет какую-либо другую работу, я бы порекомендовал перенести его в другой метод, который вы можете вызвать, не пытаясь добавить детали в контекст EF.

...