有趣的问题。
我建议您为每个数据库使用单独的 EDM,并在模型(DAL 存储库)之上添加另一层(类库)。该层将是来自您的控制器的单点调用。然后在这一层中,您可以将调用定向到特定的数据上下文并返回结果。您可能还想为您的两个数据库创建通用 POCO,然后结合使用接口将为您提供强大的设计模式。
这样,您的模型对它连接到哪个数据库一无所知 - 这是您的 DAL 存储库的工作。
当您创建您的 EDMX(在设计器中)时,请确保在尝试使用数据上下文之前在属性窗口中指定“命名空间”是唯一的。
当然,作为最后的手段(如果上述方法对您不起作用),您可以为每个 EDM 创建单独的程序集,并将调用定向到 DAL 中的特定程序集。
这是我的设置方式(我很简单,' Foo
' - 蒙面术语)
我tblFoo
的EDMX
.
MyApp.Model.Repository (Class Library)
- `Foo.edmx` (`internal`, namespace `MyApp.Model.Repository`)
- `ILinqRepository.cs` (defines methods such as `IList<Foo> GetFoo`)
- `EntityFrameworkRepository.cs` (concrete implemenation of `ILinqRepository`)
projects a collection of `tblFoo` into type `Foo`
MyApp.Model.Service (Class Library)
- `IDataService.cs` (similar signatures to `ILinqRepository`)
- `LinqDataService.cs` (concrete implementation of `ILinqRepository`)
'greedy' constructor accepts interface `ILinqRepository`
and invokes methods on it
ie:
public ILinqRepository _repository
public LinqDataService(ILinqRepository repository)
{
_repository = repository;
}
public List<Foo> GetFoo()
{
return _repository.GetFoo();
}
MyApp.Model.Entities (Class Library)
- POCO classes such as "`Foo`".
MyApp.WebApplication (MVC2)
所以,我使用IOC
(StructureMap) 将接口的具体实现注入到Controllers/ServiceModel.
这样就有了 1-1 的“类似堆栈”的方法:
控制器 -> Model.Service -> Model.Repository -> EDMX
EDMX
在您的情况下,您可以在您的repository
(例如该表称为tblFoo2
)中添加另一个。然后,您的repository
两种方法都将从tblFoo -> Foo
or投影tblFoo2 -> Foo
。
您的控制器引用了 POCO,而不是表(因为它们是internal
)。
您可以轻松地向存储库添加越来越多的功能,而无需触及任何其他层。
现在我知道这对你的场景来说可能是矫枉过正(你可能不喜欢使用 IoC - 只是在具体类上调用),但这对我有用。
希望这可以帮助!