在我的数据库中,我有表tblCountry和tblCity。它们是1:N关系。在我的域项目中,我用City和Country类来表示它们。我真的需要在城市类中使用CountryId还是只需要Country对象?
城市班:
public class City
{
public int CityId {get;set;}
public string Name {get;set;}
public double Longitude {get;set;}
public double Latitude {get;set;}
// This confuse me... is this modeled fine?
public int CountryId {get;set;}
public Country Country {get;set;}
}
国家/地区
public class Country
{
public int CountryId {get;set;}
public string Name {get;set;}
public IEnumerable<City> Cities {get;set;}
}
我填写像这样的城市对象:
...
City myCity = GetCityByCityId(cityId);
myCity.Country = GetCountryByCountryId(myCity.CountryId);
return myCity;
...
答案 0 :(得分:1)
在这种情况下,国家是一个聚合根,它应该被所有包含的城市填充,然后你可以简单地获得你想要的国家,并在聚合根中找到城市。
public class City
{
public int Id {get;set;}
public string Name {get;set;}
public double Longitude {get;set;}
public double Latitude {get;set;}
public City(Country country)
{ this.Country = country; }
}
public class Country
{
public int Id {get;set;}
public string Name {get;set;}
public IEnumerable<City> Cities {get;set;}
}
...
Country myCountry = repository.GetCountryByID(xyz); // return a country with all cities filled
City myCity = myCountry.Cities.First(c => c.Id = cityId);
return myCity;
...
根据设计,如果City是聚合根,那么设计将是
public class City
{
public int Id {get;set;}
public string Name {get;set;}
public double Longitude {get;set;}
public double Latitude {get;set;}
public Country Country {get;set;}
}
public class Country
{
public int Id {get;set;}
public string Name {get;set;}
}
...
City myCity = repository.GetCityByID(xyz); // return a city with the associated country
Country myCountry = myCity.Country;
return myCity;
...
答案 1 :(得分:1)
我真的需要在城市类中使用CountryId还是只需要Country对象?
域名关系是“城市位于国家/地区”。代码应尽可能基于域。您的City类将引用Country对象:
class City {
private Country _country;
}
你不应该在城市中拥有CountryId,因为它是一种持久性技术性。它应由您的数据访问层(ORM)处理。
答案 2 :(得分:0)
我更喜欢以下内容:
public class City
{
public int CityId {get;set;}
public string Name {get;set;}
public double Longitude {get;set;}
public double Latitude {get;set;}
public int CountryId {get;set;}
public Country Country {get;set;}
public void LoadCountryFromDB()
{
this.Country = GetCountryByCountryId(this.CountryId);
}
}
有很多数据层生成工具和模型以及代码生成: CSLAGen和MyGeneration是ORM工具之一(对象关系映射)。 尝试搜索它们。