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