У меня есть объект EF под названием SportDivision. Для простоты я не буду включать все поля, только те, которые имеют отношение:
[Table("SportDivision", Schema = "dbo")]
public class SportDivision: BaseReferenceEntity
{
public int Id { get; set; }
public string Name { get; set; }
public int SportId { get; set; }
[ForeignKey("SportId")]
public virtual Sport Sport { get; set; }
}
Итак, у него есть SportId и внешний ключ, указывающий на таблицу Sport.
Теперь я не могу просто использовать объект EF в своих представлениях, поэтому у меня есть класс модели, который сопоставлен с SportDivision и называется SportDivisionModel:
public class SportDivisionModel: BaseReferenceModel
{
public int Id { get; set; }
public string Name { get; set; }
public int SportId { get; set; }
//Read only fields
public string Sport { get; set; }
}
Я использую Autopper для передачи данных из SportDivision в SportDivisionModel и наоборот. Отображение выглядит так:
Mapper.CreateMap<SportDivision, SportDivisionModel>()
.ForMember(x => x.Sport, c => c.MapFrom(e => e.Sport.Name));
Mapper.CreateMap<SportDivisionModel, SportDivision>();
И у меня есть универсальный сервис, который CRUDs и переводит данные от объекта к модели или от модели к объекту. Все отлично работает, кроме Create, функция которого показана ниже:
public TModel Create<TModel, TEntity>(TModel entry)
where TModel : BaseReferenceModel
where TEntity : BaseReferenceEntity
{
var dm = ServiceLocator.Current.GetInstance<ICrudService<TEntity>>();
var raw = Mapper.Map<TModel, TEntity>(entry);
var created = dm.CreateOrUpdate(raw);
return Mapper.Map<TEntity, TModel>(dm.FindById(created.Id));
}
В самой последней строке, где вы видите dm.FindById(created.Id)
, он возвращает объект SportDivisionModel без спортивного имени. Исключение с нулевой ссылкой найдено в .ForMember(x => x.Sport, c => c.MapFrom(e => e.Sport.Name));
. Спорт не загружался после того, как запись была только что создана в базе данных.
Я отладил код и вижу, что запись с действительным SportId заносится в таблицу SportDivision моей базы данных, но когда я пытаюсь перенести ее в свое приложение MVC, он не получает все информация.
Это только проблема при создании. Если я просто получаю данные из базы данных, не создавая их заранее, или если я редактирую информацию, то поле Спорт в моем объекте модели заполняется. Я не знаю, почему это происходит, и я не могу использовать .Include в моем общем вызове службы (потому что не все классы BaseReferenceEntity имеют внешний ключ, указывающий на Sport).
Пожалуйста, сообщите. Заранее спасибо.