Я получаю то, что, по моему мнению, представляет собой бесконечный цикл, когда я пытаюсь создать модели представления из данных моей модели, то есть сопоставить их. Ошибка, которую я получаю, - это «ошибка переполнения стека».
Я считаю, что проблема в том, что при создании RouteViewModel необходимо создать RouteAddresses, но поскольку они также содержат ссылку на Route, он должен создать их и, следовательно, зацикливается бесконечно. Я не уверен, как это решить. Я думал, возможно, просто сохранить идентификатор маршрута, а не весь объект Route в таблице RouteAddress, но я не уверен, будет ли это работать с Entity Framework.
Ссылка на мой репозиторий:
https://github.com/SpaceWarlord/SampleCode
У меня есть следующие модели, которые представляют мои таблицы: RouteModel может состоять из одного, одного или нескольких RouteAddressModel.
RouteAddressModel содержит RouteModel, AddressModel и поле order, чтобы я мог установить RouteAddresses в порядке внутри маршрута при переходе от A -> B -> C.
AddressModel содержит данные по адресу.
RouteModel:
[Table("Route", Schema = "TPT")]
public class RouteModel : IModel
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public List? RouteAddresses { get; set; }
public float Distance { get; set; }
public RouteModel()
{
}
}
RouteAddressModel — объединяющая таблица с полезной нагрузкой:
[Table("RouteAddress", Schema = "TPT")]
public class RouteAddressModel : IModel
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int RouteId { get; set; }
[ForeignKey("RouteId")]
public RouteModel Route { get; set; }
public int AddressId { get; set; }
[ForeignKey("AddressId")]
public AddressModel Address { get; set; }
public int Order { get; set; }
public RouteAddressModel() { }
}
AddressModel:
[Table("Address", Schema = "TPT")]
public class AddressModel : IModel
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public string? UnitNum { get; set; }
public string StreetNum { get; set; }
public string StreetName { get; set; }
public int StreetTypeId { get; set; }
[ForeignKey("StreetTypeId")]
public StreetTypeModel StreetType { get; set; }
public int SuburbId { get; set; }
[ForeignKey("SuburbId")]
public SuburbModel Suburb { get; set; }
public string City { get; set; } = "Adelaide";
public string? GPS { get; set; }
public List RouteAddresses { get; set; }
public AddressModel() { }
}
Это строка кода в моей модели представления, которая приводит к сбою моей программы:
public static List ToViewModels(List? models)
{
List list = new List();
if (models!=null)
{
foreach (RouteAddressModel model in models)
{
list.Add(new RouteAddressViewModel(
new RouteViewModel(model.Route.Id, model.Route.Name,
RouteAddressViewModel.ToViewModels(model.Route.RouteAddresses),
model.Route.Distance),
new AddressViewModel(model.Address), model.Order));
}
}
return list;
}
Обновление:
Я создал следующий метод в RouteAddressViewModel, который, кажется, работает, но кажется, что это спагетти-код, тогда это правильный способ сделать что-то (я могу ошибаться):
public static List ToViewModels(List? models, RouteViewModel? routeVM)
{
List list = new List();
if (models != null)
{
if (routeVM != null)
{
Debug.WriteLine("routeVM not null");
using (var db = new SampleDbContext())
{
foreach (RouteAddressModel model in models)
{
AddressModel? addressModel = db.Addresses.Include(b => b.StreetType).Include(c => c.Suburb).SingleOrDefault(a => a.Id == model.AddressId);
AddressViewModel addressVM = new();
RouteAddressViewModel routeAddressVM = new();
if (addressModel != null)
{
addressVM = new AddressViewModel(addressModel);
routeAddressVM = new RouteAddressViewModel(routeVM, addressVM, model.Order);
list.Add(routeAddressVM);
}
else
{
Debug.WriteLine("Address was null for routeaddressModel " + model.Id);
}
}
}
}
else
{
foreach (RouteAddressModel model in models)
{
list.Add(new RouteAddressViewModel(new RouteViewModel(model.Route.Id, model.Route.Name, null, model.Route.Distance),
new AddressViewModel(model.Address), model.Order));
}
}
}
return list;
}
Что вызывается этим (в RouteViewModel)
public static RouteViewModel Create(RouteModel model)
{
RouteViewModel routeVM = new RouteViewModel(model);
routeVM.RouteAddresses = new ObservableCollection(RouteAddressViewModel.ToViewModels(model.RouteAddresses, routeVM));
return routeVM;
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... inite-loop
Как вставить в таблицу соединения полезную нагрузку, не вызывая бесконечного цикла? ⇐ C#
Место общения программистов C#
1765550132
Anonymous
Я получаю то, что, по моему мнению, представляет собой бесконечный цикл, когда я пытаюсь создать модели представления из данных моей модели, то есть сопоставить их. Ошибка, которую я получаю, - это «ошибка переполнения стека».
Я считаю, что проблема в том, что при создании RouteViewModel необходимо создать RouteAddresses, но поскольку они также содержат ссылку на Route, он должен создать их и, следовательно, зацикливается бесконечно. Я не уверен, как это решить. Я думал, возможно, просто сохранить идентификатор маршрута, а не весь объект Route в таблице RouteAddress, но я не уверен, будет ли это работать с Entity Framework.
Ссылка на мой репозиторий:
https://github.com/SpaceWarlord/SampleCode
У меня есть следующие модели, которые представляют мои таблицы: RouteModel может состоять из одного, одного или нескольких RouteAddressModel.
RouteAddressModel содержит RouteModel, AddressModel и поле order, чтобы я мог установить RouteAddresses в порядке внутри маршрута при переходе от A -> B -> C.
AddressModel содержит данные по адресу.
RouteModel:
[Table("Route", Schema = "TPT")]
public class RouteModel : IModel
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public List? RouteAddresses { get; set; }
public float Distance { get; set; }
public RouteModel()
{
}
}
RouteAddressModel — объединяющая таблица с полезной нагрузкой:
[Table("RouteAddress", Schema = "TPT")]
public class RouteAddressModel : IModel
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int RouteId { get; set; }
[ForeignKey("RouteId")]
public RouteModel Route { get; set; }
public int AddressId { get; set; }
[ForeignKey("AddressId")]
public AddressModel Address { get; set; }
public int Order { get; set; }
public RouteAddressModel() { }
}
AddressModel:
[Table("Address", Schema = "TPT")]
public class AddressModel : IModel
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public string? UnitNum { get; set; }
public string StreetNum { get; set; }
public string StreetName { get; set; }
public int StreetTypeId { get; set; }
[ForeignKey("StreetTypeId")]
public StreetTypeModel StreetType { get; set; }
public int SuburbId { get; set; }
[ForeignKey("SuburbId")]
public SuburbModel Suburb { get; set; }
public string City { get; set; } = "Adelaide";
public string? GPS { get; set; }
public List RouteAddresses { get; set; }
public AddressModel() { }
}
Это строка кода в моей модели представления, которая приводит к сбою моей программы:
public static List ToViewModels(List? models)
{
List list = new List();
if (models!=null)
{
foreach (RouteAddressModel model in models)
{
list.Add(new RouteAddressViewModel(
new RouteViewModel(model.Route.Id, model.Route.Name,
RouteAddressViewModel.ToViewModels(model.Route.RouteAddresses),
model.Route.Distance),
new AddressViewModel(model.Address), model.Order));
}
}
return list;
}
Обновление:
Я создал следующий метод в RouteAddressViewModel, который, кажется, работает, но кажется, что это спагетти-код, тогда это правильный способ сделать что-то (я могу ошибаться):
public static List ToViewModels(List? models, RouteViewModel? routeVM)
{
List list = new List();
if (models != null)
{
if (routeVM != null)
{
Debug.WriteLine("routeVM not null");
using (var db = new SampleDbContext())
{
foreach (RouteAddressModel model in models)
{
AddressModel? addressModel = db.Addresses.Include(b => b.StreetType).Include(c => c.Suburb).SingleOrDefault(a => a.Id == model.AddressId);
AddressViewModel addressVM = new();
RouteAddressViewModel routeAddressVM = new();
if (addressModel != null)
{
addressVM = new AddressViewModel(addressModel);
routeAddressVM = new RouteAddressViewModel(routeVM, addressVM, model.Order);
list.Add(routeAddressVM);
}
else
{
Debug.WriteLine("Address was null for routeaddressModel " + model.Id);
}
}
}
}
else
{
foreach (RouteAddressModel model in models)
{
list.Add(new RouteAddressViewModel(new RouteViewModel(model.Route.Id, model.Route.Name, null, model.Route.Distance),
new AddressViewModel(model.Address), model.Order));
}
}
}
return list;
}
Что вызывается этим (в RouteViewModel)
public static RouteViewModel Create(RouteModel model)
{
RouteViewModel routeVM = new RouteViewModel(model);
routeVM.RouteAddresses = new ObservableCollection(RouteAddressViewModel.ToViewModels(model.RouteAddresses, routeVM));
return routeVM;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79844750/how-to-insert-into-a-join-table-with-a-payload-without-causing-an-infinite-loop[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия