Я столкнулся с интересной ошибкой в моем приложении ASP.NET MVC 3, использующей Entity Framework 4.1 Code First. У меня есть три класса / таблицы, которые объединены в последовательности. Есть Invitation
, который имеет ссылку на Project
, который затем имеет ссылку на Company
.
Когда я загружаю компанию и сохраняю ее, все в порядке. То же самое для проектов. Однако, когда приглашение редактируется и сохраняется, оно стирает поля в компании. Они все пустые!
Когда я редактирую проект, мне нужно показать некоторую информацию от компании, поэтому я явно загружаю ее с .Include(x => x.Company)
. Когда я редактирую приглашение, мне не нужна компания, поэтому я не потрудился включить его.
Я думаю, что если объект не был загружен, у EF не должно быть никаких причин помечать его как отредактированный, верно?
Обновление : После долгой отладки с помощью комментирования строк кода я немного его сузил.
Фактический очищаемый объект был Contact
объектом, на который ссылается компания. И это не было действительно очищено настолько, насколько новый контакт был создан в конструкторе (таким образом это не будет нулевым для новых Компаний.)
Итак, я думаю, это меняет мой вопрос: Есть ли способ установить свойство по умолчанию равным значению по умолчанию, не нарушая 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; }
// ...
}