Entity Framework не заполняет свойство Navigation на изменениях - PullRequest
1 голос
/ 04 ноября 2011

В настоящее время я пытаюсь создать веб-интерфейс для редактора отчетов, который позволяет пользователю создавать различные разделы, которые в основном являются текстовыми полями.Первый экран, который я позволяю пользователю видеть, заставляет его заполнять некоторые очень незначительные исходные данные, и я использую его для создания новой записи таблицы отчета.Я использую t4 для генерации моих простых репозиториев:

public Entities.Result Add(ref Report entity) {

            Entities.Result result;

            try {

                this.Context.Reports.AddObject(entity);

                this.Context.SaveChanges();

                result = new Entities.Result {
                    Success = true,
                    Messages = new List<Entities.ResultMessage>()
                };

            } catch (System.Exception ex) {

                this.EventLogger.Error(ex);

                List<Entities.ResultMessage> messages = new List<Entities.ResultMessage>();

                messages.Add(new Entities.ResultMessage { Message = ex.ToString(), MessageSeverity = 10 });

                result = new Entities.Result {
                    Success = false,
                    Messages = messages
                };

            }

            return result;
        }

и то же самое, когда они добавляют новый раздел

public Entities.Result Add(ref ReportSection entity) {

            Entities.Result result;

            try {

                this.Context.ReportSections.AddObject(entity);

                this.Context.SaveChanges();

                result = new Entities.Result {
                    Success = true,
                    Messages = new List<Entities.ResultMessage>()
                };

            } catch (System.Exception ex) {

                this.EventLogger.Error(ex);

                List<Entities.ResultMessage> messages = new List<Entities.ResultMessage>();

                messages.Add(new Entities.ResultMessage { Message = ex.ToString(), MessageSeverity = 10 });

                result = new Entities.Result {
                    Success = false,
                    Messages = messages
                };

            }

            return result;
        }

Я вызываю это из контроллера индекса в виде:

Report newReport = new Report() {
                ApprovalDate = null,
                Approver = string.Empty,
                Author = System.Web.Security.Membership.GetUser().UserName,
                Created = DateTime.Now,
                IsActive = true,
                IsSubmitted = false,
                ReleaseDate = null,
                SerialNumber1 = string.Empty,
                SerialNumber2 = string.Empty
            };

            var result = this._reportRepository.Add(ref newReport);

все проходит хорошо, и я получаю запись в базе данных.Затем я беру некоторые из их записей для заполнения начального объекта ReportSection, например, так:

var newSection = new ReportSection {
                    DisplayOrder = 1,
                    ReportId = newReport.Id,
                    ReportSectionTypeId = 1,
                    SectionText = title
                };
var r = this._reportSectionRepository.Add(ref newSection);

Вы заметите, что я имею в виду newReport.Id, поэтому у меня есть действительный идентификатор, возвращаемый из хранилища.добавить метод.Метод add раздела возвращает мне действительный объект newSection, который имеет действительный идентификатор, и когда я проверяю в БД, он существует.Однако EF не заполняет навигационное свойство в newSection.Report, которое позволяет мне переходить между ними.Это то, что я пытаюсь выяснить, почему это не доступно?У меня есть временное решение, которое не работает с некоторой логикой проверки DAL, но я могу загрузить объект Report, затем добавить ReportSection через Report.ReportSections и затем вызвать метод обновления в репозитории, который выполняет ApplyCurrentValues.

Немного подробнее: Visual Studio 2010 C # .Net 4.0 MVC 2.0 EF 4.0 (или, возможно, 4.1) Я использую Ninject для заполнения репозиториев:

 Bind<IReportRepository>().To<ReportRepository>().WithConstructorArgument("connectionString",
        ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);

1 Ответ

1 голос
/ 04 ноября 2011

Вы можете напрямую установить свойство навигации вместо свойства внешнего ключа:

var newSection = new ReportSection {
    DisplayOrder = 1,
    Report = newReport,
    ReportSectionTypeId = 1,
    SectionText = title
};

Если контекст в _reportRepository и _reportSectionRepository одинаков и newReport все еще привязан к нему, это все, что вам нужно сделать.

Если контексты не совпадают или newReport не привязан к контексту, вы должны сначала присоединить newReport к контексту:

public Entities.Result Add(ref ReportSection entity) {
    Entities.Result result;
    try {
        this.Context.Reports.Attach(entity.Report);
        this.Context.ReportSections.AddObject(entity);
        this.Context.SaveChanges();

        // etc.
...