В настоящее время я пытаюсь создать веб-интерфейс для редактора отчетов, который позволяет пользователю создавать различные разделы, которые в основном являются текстовыми полями.Первый экран, который я позволяю пользователю видеть, заставляет его заполнять некоторые очень незначительные исходные данные, и я использую его для создания новой записи таблицы отчета.Я использую 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);