¿Qué causaría que Entity Framework guarde una referencia descargada (pero cargable) sobre los datos existentes?

Me encuentro con un error interesante en mi aplicación ASP.NET MVC 3 usando Entity Framework 4.1 Code First. Tengo tres clases / tablas que se unen en secuencia. Hay unInvitation que tiene una referencia a unaProject que luego tiene una referencia aCompany.

Cuando cargo una empresa y la guardo, todo está bien. Lo mismo para proyectos. Sin embargo, cuando la invitación se edita y se guarda, borra los campos de la empresa. ¡Todos están en blanco!

Cuando edito el proyecto, necesito mostrar información de la compañía, así que lo estoy cargando explícitamente con.Include(x => x.Company). Sin embargo, cuando edito la invitación, no necesito la compañía, así que no me he molestado en incluirla.

Creo que si el objeto nunca se cargó, entonces no debería haber ninguna razón para que EF lo marque como editado, ¿verdad?

Actualiza: Después de mucha depuración comentando líneas de código, lo he reducido un poco.

l objeto real que se borró fue unContact objeto al que hace referencia la empresa. Y en realidad no se estaba despejando tanto como se creó un nuevo contacto en el constructor (por lo que no sería nulo para nuevas empresas).

Así que supongo que eso cambia mi pregunta: ¿Hay alguna manera de tener una propiedad referenciada establecida en un valor predeterminado sin romper EF?

public class InvitationController
{
    [HttpPost]
    public RedirectToRouteResult AcceptInvitation(int id, int companyId, int projectId, Invitation invitation)
    {
        // This line triggered the problem by loading a company, without 
        // eagerly loading the contacts.
        CheckAuthorizationEdit(companyId, CommunicationService.GetById(id));

        var dbResponse = InvitationService.GetPreviousResponse(companyId, projectId);
        dbResponse.WillBid = invitation.WillBid;
        InvitationService.Save(dbResponse);

        return RedirectToAction("Response", new { id, companyId } );
    }

    private void CheckAuthorizationEdit(int companyId, Communication communication)
    {
        var companyIds = communication.DistributionList.Companies.Select(c => c.Id).ToList();
        //CheckAuthorization(companyIds);
    }
}

public class InvitationService
{
    public Invitation GetPreviousResponse(int companyId, int projectId)
    {
        return (from invitation in _db.Invitations
                where invitation.ProjectId == projectId && invitation.SenderCompanyId == companyId
                select invitation).SingleOrDefault();
    }

    public void Save(Invitation invitation)
    {
        _db.SaveChanges();
    }
}

public class Invitation
{
    public int Id { get; set; }
    public int ProjectId { get; set; }
    [ForeignKey("ProjectId")]
    public virtual Project Project { get; set; }
    // ...
}


public class Project
{
    public int Id { get; set; }
    public int CompanyId { get; set; }
    [ForeignKey("CompanyId")]
    public virtual Company Company { get; set; }
    // ...
}

public class Company
{
    public Company()
    {
        MainContact = new Contact();
    }

    public int Id { get; set; }
    public virtual Contact MainContact { get; set; }
    // ...
}

public class Contact
{
    public int Id { get; set; }
    public string AddressLine1 { get; set; }
    // ...
}