应该如何设计域类?

时间:2012-01-03 14:00:10

标签: c# asp.net

我想提供一个示例和一些要求,并希望了解最佳域模型应该是什么。

数据库是:

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;}
}
  1. 当我想要更新城市时,我可以拿下国家的ID 并更新它。所以这个设计有效。
  2. 当我想插入一个新的     城市,我可以拿城市对象并将其插入到Db中。所以这个设计     作品。

  3. 当我想要删除一个城市时,我会选择城市和城市的ID         从Db中删除它。所以这个设计有效。

  4. 当我想要展示一个城市时,     我还需要UI中的网格中的country列,因此这种设计不起作用。

  5. 然后,我会从国家/地区ID列中获取每个城市的国家/地区,这很痛苦。

    如果我有Country拥有City类的属性,那么我将不得不为所有城市对象创建Country对象,并且在更新,插入和删除期间我不需要country对象 - 我只需要CountryId。

    所以我的问题是:

    • 我应该如何设计它们?
    • 我应该在中创建CountryName属性吗? 城市班?
    • 我应该尝试另外推荐的方法吗?

2 个答案:

答案 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类实体框架默认设计它的方式