O que levaria o Entity Framework a salvar uma referência descarregada (mas lenta e carregável) sobre os dados existente

Estou com um bug interessante no meu aplicativo ASP.NET MVC 3 usando o Entity Framework 4.1 Code First. Eu tenho três classes / tabelas que são unidas em sequência. Há umaInvitation que tem uma referência a umProject, que tem uma referência aCompany.

Quando carrego uma empresa e a salvo, tudo fica bem. O mesmo para projetos. No entanto, quando o convite é editado e salvo, ele limpa os campos da empresa. Eles estão todos em branco!

Quando edito o projeto, preciso mostrar algumas informações da empresa, por isso estou carregando explicitamente isso com.Include(x => x.Company). Porém, quando edito o convite, não preciso da empresa e não me incomodei em incluí-lo.

Eu acho que, se o objeto nunca foi carregado, não deveria haver motivo para a EF sinalizá-lo como editado, cert

Atualiza: Depois de muita depuração através do comentário de linhas de código, reduzi-o alguma

O objeto real sendo limpo era umContact objeto referenciado pela empresa. E realmente não estava sendo limpo tanto quanto um novo contato foi criado no construtor (para que não fosse nulo para novas empresas.)

Então, eu acho que isso muda minha pergunta:xiste uma maneira de ter uma propriedade referenciada definida como um valor padrão sem quebrar o E

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; }
    // ...
}

questionAnswers(1)

yourAnswerToTheQuestion