Linq-to-SQL: внешний ключ недоступен, пока транзакция не будет зафиксирована - PullRequest
2 голосов
/ 08 июня 2011

Я обнаружил, что с Linq-to-SQL, когда вы создаете новый объект, вы не можете получить доступ к члену внешнего ключа, пока не вызовете SubmitChanges в контексте, с которым новый объект «создается».Я, конечно, понимаю, что FK на самом деле не существует, пока вы не добавите новый объект в базу данных - но, похоже, информация существует для того, чтобы поиск мог работать.Взять, к примеру, приведенный ниже код.

public Course Create(string name, int teacherID)
{
     using (MyDataContext context = new MyDataContext())
    {
        Course c = new Course();

        c.Name = name;
        c.TeacherID = teacherID; //FK here, assume the value references a valid Teacher.
        context.Courses.InsertOnSubmit(c); //c now has a context it can use.

        //Try to do some validation here, before commiting the Course to the database.
        //c.Teacher will be null here, leading to an exception.
        if (c.Teacher.FirstName.Equals("Phil"))
            throw new ApplicationException("Phil quit last year."); //Throwing here would cause the transaction to never commit, good.

        context.SubmitChanges();

        //Email the teacher.
        SendEmail(c.Teacher.EmailAddress); //c.Teacher is no longer null, this would work fine.
    }
}

В приведенном выше коде есть несколько комментариев, которые должны проиллюстрировать то, что я спрашиваю.Мой вопрос в основном такой:

Почему я должен сначала SubmitChanges, чтобы найти значение на основе примитивного идентификатора (FK), который уже установлен на объекте?

1 Ответ

4 голосов
/ 08 июня 2011

Да, c.Teacher будет быть нулевым там.Linq-To-Sql не предоставляет какого-либо механизма для загрузки объекта на основе заполненного вручную столбца внешнего ключа (по крайней мере, до тех пор, пока вы не доберетесь до SubmitChanges).Конечно, было бы ленивой загрузкой, если вы вытащили сущность из БД - но здесь вы ее создаете.Либо передайте сущность teacher (вместо идентификатора), либо вручную извлеките сущность и установите вместо нее:

c.Teacher = teacher

Вместо

c.TeacherID = teacherID
...