我目前正在设计一个班级"用户"
public class User
{
...
public int LocationId {get; set;}
public string LocationName
{
get
{
//Get name from the LocationList based on the LocationId
}
}
public List<SelectListItem> LocationList
{
get
{
//Retrieve the location as list from DB
}
}
....
}
我担心的是每次创建新对象时,都会访问数据库并检索位置列表。
可以通过这种方式创建课程吗?或者有更好的方法吗?任何帮助将受到高度赞赏。感谢。
答案 0 :(得分:3)
只有在访问LocationList
时才会触发数据库,而不是在新建类时。但是,不,这不是最好的方法。实体类/视图模型不应直接与您的上下文交互。最大的原因是你应该只有一个且只有一个你的上下文实例,而且并不总是可以将它正确地注入这些类中。
相反,您应该使用存储库或服务类来抽象出查询,然后通过调用存储库或服务上的某个方法直接在控制器操作中设置list属性。
答案 1 :(得分:2)
除了克里斯提到的内容之外,还有一点,请看一下这条规则:
CA1002: Do not expose generic lists
因此,一般来说,该类不应公开返回通用列表的任何属性。尝试使用以下其中一种:
System.Collections.ObjectModel.Collection
System.Collections.ObjectModel.ReadOnlyCollection
System.Collections.ObjectModel.KeyedCollection
答案 2 :(得分:0)
每当与外部系统/源进行通信时,建立存储库几乎总是一个好主意。
通过这种方式,您可以在一个位置拥有与给定源交互的所有逻辑,并且可以在该特定位置调试和编辑它。另外,正如Chris Pratt所提到的那样,您在任何给定时间都应该只使用一个数据库上下文。