我想提供一个示例和一些要求,并希望了解最佳域模型应该是什么。
数据库是:
One Country has Many Cities.
One City has many Towns
两个表都有Id列。
在我的C#中,我有
public class Country
{
public List<City> Cities {get;set;}
public int Id;
}
public class City
{
public int Id {get;set;}
public int CountryId {get;set;}
}
当我想插入一个新的 城市,我可以拿城市对象并将其插入到Db中。所以这个设计 作品。
当我想要删除一个城市时,我会选择城市和城市的ID 从Db中删除它。所以这个设计有效。
当我想要展示一个城市时, 我还需要UI中的网格中的country列,因此这种设计不起作用。
然后,我会从国家/地区ID列中获取每个城市的国家/地区,这很痛苦。
如果我有Country拥有City类的属性,那么我将不得不为所有城市对象创建Country对象,并且在更新,插入和删除期间我不需要country对象 - 我只需要CountryId。
所以我的问题是:
答案 0 :(得分:1)
如果我有Country拥有City类的属性,那么我将不得不为所有城市对象创建Country对象,并且在更新,插入和删除期间我不需要country对象 - 我只需要CountryId 的
在所有Country
个对象中填充City
对象有什么问题?他们不需要填充,您只需存储ID。这在ORM世界中被称为延迟加载(也可能在外部)。
例如:
public class Country
{
private List<City> _cities;
public int Id { get;set; }
public IEnumerable<City> Cities
{
get
{
// load on demand
if (_cities == null)
_cities = LoadCities(Id);
return _cities;
}
}
}
public class City
{
public int Id { get;set; }
public Country Country { get;set; }
}
归结为关系的哪一方处于控制之中。该国是否负责更新其所有子女(级联更新),或者您只是希望纽约市能够做到这一点?无论哪种方式,持有Country对象的数据都远不如让ID漂浮在周围。
如果您在城市和国家/地区表(而不是负载城市)之间执行联接,那么您无论如何都会拥有每个城市的国家/地区ID,并预先获取数据。
答案 1 :(得分:0)
为什么不直接从City添加反向引用Country对象?这样,如果您需要国家名称,您可以这样做:
string countryname = city.Country.Name;
这就是ORM类实体框架默认设计它的方式