Да, я обновил код, добавив конструктор. Я склоняюсь к заводскому методу.

лкнулся с интересной ошибкой в ​​моем приложении 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; }
    // ...
}

Ответы на вопрос(1)

Ваш ответ на вопрос