实体框架上下文

时间:2011-11-22 15:10:44

标签: entity-framework-4

我首先使用实体​​框架代码。我的设置是我有一个核心服务,所有其他服务继承。核心服务包含以下代码:

public static DatabaseContext db = new DatabaseContext();

    public CoreService()
    {
        db.Database.Initialize(force: false);
    }

然后,另一个类将继承自CoreService,当需要查询数据库时,将只运行一些代码,如:

db.Products.Where(blah => blah.IsEnabled);

然而,我似乎在争论最好的故事。

有些人建议不要做我正在做的事情。

其他人说你应该为每个类定义上下文(而不是使用基类来实例化它)

其他人说,对于每个数据库调用,我都应该将它包装在一个使用块中。我从来没有在微软的任何一个例子中看到这一点。

任何人都可以澄清吗?

我目前正处于重构可能且非常快的阶段,所以如果可能的话,我想要一些一般的建议。

3 个答案:

答案 0 :(得分:1)

您应该为每个Web请求包装一个上下文。只要你需要它就把它打开,然后在你完成时把它拿掉。这就是使用的目的。

不要在Singleton中包装你的上下文。这不是一个好主意。

如果您正在与WinForms等客户合作,那么我认为您将围绕每个表单包装上下文,但这不是我的区域。

另外,请确保您知道何时要对数据源执行实际操作,这样您在完成一次处理结果时可能只需要多次枚举。

最后,你已经看过MS的这种做法,因为很多ADO东西支持包含在一个使用中,但几乎没有人意识到这一点。

答案 1 :(得分:0)

我建议使用设计原则“首选组合而不是继承”。 您可以在基类中引用数据库上下文。 实现单例以获取DataContext并将datacontext分配给此引用。

答案 2 :(得分:-1)

您获得的冲突与在类之间共享上下文无关,而是由您的上下文的static声明引起的。如果您将上下文设置为服务类的 instance 字段,以便每个服务实例都有自己的上下文,那么应该没有问题。

您提到的using模式不是必需的,但您应该确保在服务处理中调用context.Dispose()