实体框架参考,多层应用程序

时间:2011-11-30 11:42:42

标签: asp.net-mvc asp.net-mvc-3 entity-framework entity-framework-4

我已经为我的域(POCO)和存储库设置了单独的类库的MVC应用程序。现在我的DbConxet目前在域层,我想添加以下内容:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }

但它无法找到DbModelBuilder。现在我检查了我的引用并注意到它引用了EFCodeFirst0.8 / lib / EntityFramework.dll当我将其更改为EntityFramework4.2.0.0 / lib / EntityFramework.dll时,DbModelBuilder可用但我收到错误,因为我的解决方案中的其他项目( MVC和Repo)引用了原始的dll。所以我更新它们但是然后MVC层在App_Start / SQLCEEntityFramework.cs中有问题

我做错了什么?!我应该在我的应用程序的另一部分中使用OnModelCreating并重置对原始EFCodeFirst0.8 / lib / EntityFramework.dll的所有引用吗?或者修复App_Start / SQLCEEntityFramework.cs中的错误?

全心全意,

詹姆斯

1 个答案:

答案 0 :(得分:0)

你做错了:)

POCO,存储库模式以及用于持久性无知的所有内容实际上没有意义,当您在任何地方引用实体框架并且您的域与之绑定时。

您的域应该是纯类库(当然还有组件模型,数据注释等),而不引用EF。

然后你应该在你的MVC应用程序和“所有可能的存储库”之间有“契约”(即接口,在另一个类库中) - 也是EF不可知的。

最后,您拥有该合同的“一个特定实现” - 您的EF存储库。这应该是引用EF库的唯一项目。

关键是,如果你老板来了,说“好吧,我们切换到nhibernate”,你就可以重播“没问题,我只需要编写另一个实现此接口的存储库,并在IoC容器配置中更改1行” 。作为奖励,您只能在1个地方更新您的EF参考:)