2013-10-25 32 views
0

我创建了一个公司的MVC4“模板”,其中包含基本的帮助程序,用户功能等,只是每个项目需要的东西。在多个项目中分离DbContext

现在我试图分开Users部分,它由3部分组成:controllers/models/views,业务层和数据层。

现在我遇到了问题,我拿出数据层的一部分,并把它放在一个单独的项目,这将成为一个私人的Nuget包。

但是该软件包不会知道DbContext,因为它位于实际项目网站的DataLayer中。

的的DbContext的网站目前看起来是这样的:

public class DataContext : DbContext 
{ 
    .... 
    public DbSet<Language> Languages { get; set; } 
    public DbSet<User> Users { get; set; } 
    .... 
    public DbSet<Reservation> Reservations { get; set; } 
    .... 
} 

LanguagesUsers将在一个单独的项目/ NuGet包去Reservations将保留在网站上,因为它是网站具体。

LanguagesUsers表中都没有提及对方,但Reservations具有参照上述两个UserLanguage

这里有什么选择仍然保持完整的Code-First模型包括迁移。我可以分别为每个项目/ NuGet创建多个DbContext,代码优先的迁移是否能够选择这个,还是有更好的方法?

回答

1

如果您的预订包含语言和用户类的链接,那么您将不得不使用相同的上下文。

如果你想要更松散耦合的实现,那么只需要包含ID而不是实际的类,那么你可以使用单独的上下文,但是你将失去引用对象的容易性等等。实施实际上取决于您的项目的规模以及您计划如何更新解决方案。

+0

问题是,我有多个网站使用相同的“backoffice”,当一个错误更新时,我必须通过所有这些项目并更新源代码中的错误。如果我使用包,我不会有这个问题。 – YesMan85

+0

您应该使用Repository模型和接口来分离实际的实现。这样你可以隐藏前端网站的实现细节(EF上下文)。因此,而不是将DataContext公开到前端,您将返回IBackofficeService或类似的东西。然后使用DataContext创建和实现该接口。您还应该考虑使用某种IoC(Inversion of Control)库,例如Unity。在那里你可以注册你的实现并在MVC中创建一个像这样的MyController(IBackofficeService服务)的控制器。 – Woland

+0

下面是一个关于如何用EF实现这种方法的指南http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of -work图案功能于一个-ASP净MVC的应用程序。您还可以使用存储库模型[virtocommerce](http://virtocommerce.codeplex.com)结算我正在为更真实世界的应用程序工作的项目 – Woland