1

作为 .net MVC2 和实体框架的相对新手,我正在开发一个需要单个 Web 应用程序(C# .net 4)的项目,以根据访问路径(即子域)连接到多个不同的数据库。

原则上这没有问题,所有的逻辑都是为了将​​子域转换为实体连接并将其传递给实体模型。

问题在于,不同的数据库虽然在结构上非常相似,但包含 3 或 4 个为该实例定制的唯一表。

在我看来,有两种方法可以解决这个问题,我相信这两种方法都不可能。

1/ 为每个数据库使用单独的实体模型。
- 沿着这条路线尝试会发生冲突,其中表/sp 名称在不同的数据库中是相同的,或者当我尝试将不同的模型放在不同的命名空间中时出现隐式转换错误。

或者

2/ 根据基本控制器属性的值覆盖引用可变数据库对象的类。
-我没有发现任何迹象表明我什至可以做到这一点。


我的问题是这些路线中的任何一条原则上是否可以工作,或者我是否应该放弃 EF 并使用 ADO 直接连接到数据库。也许还有另一种方法可以解决我没有想到的这个问题?

谢谢你的帮助...

4

1 回答 1

0

有趣的问题。

我建议您为每个数据库使用单独的 EDM,并在模型(DAL 存储库)之上添加另一层(类库)。该层将是来自您的控制器的单点调用。然后在这一层中,您可以将调用定向到特定的数据上下文并返回结果。您可能还想为您的两个数据库创建通用 POCO,然后结合使用接口将为您提供强大的设计模式。

这样,您的模型对它连接到哪个数据库一无所知 - 这是您的 DAL 存储库的工作。

当您创建您的 EDMX(在设计器中)时,请确保在尝试使用数据上下文之前在属性窗口中指定“命名空间”是唯一的。

当然,作为最后的手段(如果上述方法对您不起作用),您可以为每个 EDM 创建单独的程序集,并将调用定向到 DAL 中的特定程序集。

这是我的设置方式(我很简单,' Foo' - 蒙面术语)

tblFooEDMX.

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 -> Fooor投影tblFoo2 -> Foo

您的控制器引用了 POCO,而不是表(因为它们是internal)。

您可以轻松地向存储库添加越来越多的功能,而无需触及任何其他层。

现在我知道这对你的场景来说可能是矫枉过正(你可能不喜欢使用 IoC - 只是在具体类上调用),但这对我有用。

希望这可以帮助!

于 2010-06-10T10:20:44.990 回答