模型类中的EF上下文

时间:2017-06-22 13:41:40

标签: c# entity-framework dependency-injection

在我们的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类?但是我们怎样才能在那里注入背景?

1 个答案:

答案 0 :(得分:0)

您通常希望避免要求您的模型了解其创建和使用情况,因为这些知识应该是自上而下而不是自下而上。除了其他原因之外,您还会遇到类似于您现在遇到的设计问题。您可以尝试使用扩展方法,控制框架的反转,实用方法,pocos等在应用程序级别设计您的方法,但是在一天结束时,您尝试解决仅存在的问题,因为您的基础数据库架构设计不当,无法满足您的预期用途。

例如,您的Job表引用了创建它的用户的用户名。为什么?用户名可能会更改,并且只要您需要该用户的其他关键属性,您就需要执行辅助查找(就像您在部分类中所做的那样)。如果您让Job表维护User表的外键,只要包含适当的相关实体,您就可以使用C#端的导航属性来获取完整的用户对象。在查询中。你甚至不需要部分类,你的数据库模式将变得更加可维护作为额外的奖励。

有时,最好简化数据库设计以简化代码。