Как вставить в таблицу соединения полезную нагрузку, не вызывая бесконечного цикла?C#

Место общения программистов C#
Ответить
Anonymous
 Как вставить в таблицу соединения полезную нагрузку, не вызывая бесконечного цикла?

Сообщение 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;

}


Подробнее здесь: https://stackoverflow.com/questions/798 ... inite-loop
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»