在我们的Web.API项目中,我们使用Entity Framework 6.我们有一个DataModel类,它包含DatabaseContext。 DataModel是[ThreadStatic]
单身人士。
像这样:
public class DataModel
{
[ThreadStatic] private static DataModel _instance;
public static DataModel Instance => _instance ?? (_instance = new DataModel());
public DatabaseContext Context { get; private set; }
private DataModel()
{
Context = NewContext();
}
}
现在在我们的(部分)模型类之一中,我们使用像这样的上下文:
public partial class Job
{
public User CreatedByUser
{
get { return DataModel.Instance.Context.Users.FirstOrDefault(d => d.Username == CreatedBy); }
}
}
我们在数据库中的另一个表中搜索相应的用户。这有效,但在我看来,这不是一个美丽的解决方案。特别是如果我们计划将项目迁移到.NET Core并对数据库上下文使用依赖注入。
我的问题是,是否有一种模式,它解决了问题更优雅?由于Entity Framework生成模型对象,因此依赖注入在此处不起作用。或者,如果我们将此代码从部分类移动到例如一个util类?但是我们怎样才能在那里注入背景?
答案 0 :(得分:0)
您通常希望避免要求您的模型了解其创建和使用情况,因为这些知识应该是自上而下而不是自下而上。除了其他原因之外,您还会遇到类似于您现在遇到的设计问题。您可以尝试使用扩展方法,控制框架的反转,实用方法,pocos等在应用程序级别设计您的方法,但是在一天结束时,您尝试解决仅存在的问题,因为您的基础数据库架构设计不当,无法满足您的预期用途。
例如,您的Job
表引用了创建它的用户的用户名。为什么?用户名可能会更改,并且只要您需要该用户的其他关键属性,您就需要执行辅助查找(就像您在部分类中所做的那样)。如果您让Job
表维护User
表的外键,只要包含适当的相关实体,您就可以使用C#端的导航属性来获取完整的用户对象。在查询中。你甚至不需要部分类,你的数据库模式将变得更加可维护作为额外的奖励。
有时,最好简化数据库设计以简化代码。