Да, я обновил код, добавив конструктор. Я склоняюсь к заводскому методу.
лкнулся с интересной ошибкой в моем приложении 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; }
// ...
}