Наверное, это кошмар каждого.Ну ... по крайней мере, это был мой кошмар при разработке одного из приложений.
В зависимости от вашего сценария вы можете сохранить страны, города, регионы как разные объекты.С этим подходом все можно найти, пока пользователь не выберет страну, регион или город.Похоже, вам нужно иметь пустые поля, что на самом деле не лучшая практика, потому что тогда вам придется полностью полагаться на логику приложения для поддержания целостности данных.
Примером такого подхода будет:
public class Country
{
public string Code { get; set; } //country ID would not make sense in this approach
public string Name { get; set; }
}
public class Region
{
public string Code { get; set; }
public string Name { get; set; }
public string CountryCode { get; set; } //1 region is assigned to only 1 country
}
public class City
{
public string Code { get; set; }
public string Name { get; set; }
public string RegionCode { get; set; } //1 city is assigned to only 1 region
}
Выглядит хорошо, просто для понимания, но подумайте о таблице, где вы фиксируете то, что было выбрано.Если вам небезразличен только город (последний элемент в списке зависимостей), все понятно и понятно.
public class UserSelectionWithCityOnly
{
public string CityCode { get; set; }
}
Довольно просто и понятно?Похоже, это так.Рассмотрим сценарий, в котором вы можете выбрать либо страну, либо город, либо регион .... это очень запутанно:
public class UserSelectionWithEitherSelected
{
public string? CityCode { get; set; }
public string? RegionCode { get; set; }
public string? CountryCode { get; set; }
}
хорошо ... вы всегда можете проверить, если CityCode.HasValue, но с точки зрения БДэто было бы пустое поле, которое может добавить грязные данные (должно быть хорошо, если вы не педантично относитесь к чистоте и чистоте БД)
Таким образом, я решил это путем создания одной иерархической таблицы с идентификатором родительского элемента:
public class MySolutionForDestinations
{
public int DestinationId { get; set; } //primary key
public int ParentDestinationId { get; set; }
public string Code { get; set; }
public string Name { get; set; }
public DestinationLevel Level { get; set; }
}
public enum DestinationLevel
{
Country = 0,
Region = 1,
City = 2
}
это, вероятно, не самое элегантное решение, но оно работает очень хорошо.При таком подходе вас интересует только DestinationId, который может быть идентификатором страны, региона или города, поэтому вы определенно избегаете использования грязных данных и можете выполнять сопоставление 1 к 1.
Надеюсь, это будет полезно