Я обнаружил, что с 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), который уже установлен на объекте?