asp.net-mvc - EF 代码优先模块化设计

标签 asp.net-mvc architecture entity-framework-4 ef-code-first database-migration

首先使用 ef4 代码,您可以创建和编译类和 dbcontext。当您想在模型集的已编译 dll 中添加一些类/表和关系时会发生什么?

到目前为止,我提出的解决方案是使用“部分”类,稍后会对其进行补充,第二个是编写一个全新的 dbcontext,其中以某种方式包含第一个或扩展它,但这意味着额外每个模块的数据库连接(每个数据库上下文)。有什么想法吗?最佳做法是什么?我还需要能够处理迁移。

更明确地说,一种可能的情况如下:

A)您创建一个 .dll,其中包含一些 dbContextBase 类和表(类)。

B)您以自己的方式创建依赖/扩展 dbContextBase 的其他 .dll*

C)您在项目中引用所述 .dll 并扩展它们。

所以基本上你可以有一个核心 dbContext,然后向它添加一个菜单模块,然后向它添加一个博客模块(但它可以被菜单模块看到,以便创建最新的博客文章菜单等)。最重要的是,如果您想要一个特定的一次性博客功能,您可以快速集成它,同时保持您的博客模块可更新。

正如我开始看到的那样,最好的方法是 Nuget 包,其中包含每个模块的模型(等)的源代码,而不是编译的 dll。

最佳答案

您可以在核心程序集中构建一些基础设施,这些基础设施将发现模块中的实体并将它们注册到单一上下文。每个实体必须具有派生自 EntityTypeConfiguration<> 的类(或 ComplexTypeConfiguration<> 用于复杂类型)将描述映射。

有了映射类后,您可以使用某个模块接口(interface)为每个模块收集所有映射类,或者使用反射来浏览程序集并创建映射类的实例。 DbModelBuilder 可以使用这些类。直接(在 OnModelCreating 中或直接)。

Also I need to be able to work with migrations.



我不确定迁移是否为此做好了准备,因为它有一些先决条件:
  • 所有共享表必须由核心程序集处理 - 它自己的DbMigration派生类(或新版本的类)
  • 每个模块都必须处理自己的表——它自己的DbMigration派生类(或新版本的类)
  • 模块不得更改共享表
  • 模块不得更改或访问其他模块的表

  • 这意味着您为核心设置了特殊的迁移集,并且为每个模块设置了一个迁移集。每个迁移集都在单独的程序集中定义 - 这可能是潜在的问题。我自己没有尝试过,所以我不知道 EF 迁移是否可以处理这个问题 - 我特别针对您真正需要模块化系统的场景,其中模块可以随着时间的推移添加或删除,因此您需要两个安装(Up 方法)和卸载(Down 方法)。

    迁移的问题在于,如果你开发了人们可以添加自定义模块的平台,你永远不知道它们是否会破坏你的核心。

    关于asp.net-mvc - EF 代码优先模块化设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9522534/

    相关文章:

    asp.net-mvc - Visual Studio for Mac-错误 CS1902

    java - 应用架构建议

    sql - 在 SQL Server 中分解 HUGE 表是否更好?

    c# - 是否可以为我的所有对象创建一个通用的 Repository 类?

    mysql - 当我尝试使用 MySQL 中的身份存储注册用户时出错

    asp.net-mvc - ASP.NET MVC 中的 HttpPostedFileBase 始终返回 null

    asp.net - 何时应为 .NET 4 Framework 设计新的 .NET 项目

    c# - 应该在表示层还是业务层将用户特定的 'end date' 转换为 DateTime?

    C# 4.0/EF - SQL Server Compact 不支持服务器生成的键和服务器生成的值

    asp.net-mvc - 在部分 View 中填充表