我有以下课程;
public class Hotel
{
public int HotelId {get; set;}
public string Name {get; set;}
public string Address {get; set;}
public string City{get; set;}
}
public class District
{
public int DistrictId {get; set;}
public string Name {get; set;}
}
然后我需要一个可以同时包含DistrictId和HotelId的类,所以我想创建一个类如下
public class HotelDistrict
{
public int DistrictId {get; set;}
public int HotelId {get; set;}
}
这是正确的方法吗?或者他们是更好的选择?
答案 0 :(得分:7)
这看起来很像数据库表设计。在OOP世界中,您通常会添加对类的引用,而不仅仅是对ID。
像这样的东西
public class HotelDistrict
{
public Distric District {get; set;}
public Hotel Hotel {get; set;}
}
没有银弹,所以这个规则有例外,但通常你想避免创建对数据库表有如此多气味的类。
答案 1 :(得分:7)
酒店和区有many to one relationship
。因此,酒店应该映射到相应的区域 -
public class Hotel
{
public int HotelId {get; set;}
public string Name {get; set;}
public string Address {get; set;}
public string City{get; set;}
public int DistrictId{get; set;}
}
答案 2 :(得分:0)
您只需在District
或[{1}} Hotel
中存储对List<Hotel>
的引用即可。通常,除非您正在处理编写数据库模型,否则不应保留您正在执行的唯一标识符。如果这是一个数据库模型,那么您的解决方案很好,假设您需要支持多个地区的酒店。
答案 3 :(得分:0)
出于任何原因,如果你真的需要采用原始HotelDistrict
方式,实际上你不需要新的类,你可以使用Tuple<Hotel, District>
来存储对,以及一个列表那些元组(例如List<Tuple<Hote, District>>
)存储这些对的列表。
但正如Rohit Vats所说,有一个* -1关系,所以最好将该区域作为一个字段引用,所以如果你没有使用原始方法的具体原因,我建议他的方法。
答案 4 :(得分:0)
作为其他优秀答案的替代方案,如果您更喜欢具有松散耦合对象的更明确的域模型,也可以执行以下操作。 (我假设每个酒店一次只能在一个区内。)
class Hotel
int HotelId
int DistrictId
...
class District
int DistrictId
...
class HotelsInDistrict
int DistrictId
List<int> HotelIds
好处:它松散耦合,你不需要摆弄像巨大的物体图,懒惰/急切的装载和东西等痛苦的东西。它与实际业务领域不同,而不仅仅是数据容器。它松散耦合,可以轻松修改。
缺点:它不容易映射到yourt数据库表。但是,如果它不仅仅是一组数据导向的“类”,而不仅仅是表的表示,那么它就不会有真正的对象模型。
那就是说,我真的向所有对对象建模感兴趣的人推荐一本书: