【问题标题】:can we use Existing Entities for Entity Framework rather than EF generated Entities我们可以将现有实体用于实体框架而不是 EF 生成的实体吗
【发布时间】:2015-02-14 08:52:58
【问题描述】:

我可以将已经是我项目一部分的实体用作实体框架实体

我的项目遵循领域驱动设计,其中包含代表我的数据库表的所有实体。

我不希望 Entity Framework 从我现有的数据库中生成新实体,而是希望它使用我项目中的现有实体。

每当我像这样在数据库上下文类中使用我现有的实体时:

        public DbSet<SomeOtherProjectInSoulution.ChequeBookRequestAuditLog> ChequeBookRequestAuditLogs { get; set; }
    public DbSet<SomeOtherProjectInSoulution.OfflinePayOrderRequestAuditLogEntity> OfflinePayOrderRequestAuditLogEntities { get; set; }
    public DbSet<SomeOtherProjectInSoulution.FundsTransferAuditLogEntity> FundsTransferAuditLogEntities { get; set; }

它给了我以下错误:

实体类型 FundsTransferAuditLogEntity 不是当前模型的一部分 上下文。

即使这些实体是实体框架创建的实体的精确副本,但我删除了它们

数据库上下文:

public partial class PRISMEntitiesTest : DbContext
{
    public PRISMEntitiesTest()
        : base("name=PRISMEntitiesTest")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public DbSet<Application.Domain.AuditLog.ChequeBookRequestAuditLog> ChequeBookRequestAuditLogs { get; set; }
    public DbSet<Application.Domain.AuditLog.OfflinePayOrderRequestAuditLogEntity> OfflinePayOrderRequestAuditLogEntities { get; set; }
    public DbSet<Application.Domain.AuditLog.FundsTransferAuditLogEntity> FundsTransferAuditLogEntities { get; set; }
}

【问题讨论】:

  • 请显示更多代码,说明您如何定义DbContext 类。您要做的只是“EF Code First”,我一直在使用它,没有任何问题。您可以定义自己的 POCO,并使用它们来定义您的 Code First 模型。
  • @JotaBe 我以某种方式解决了这个问题,但是每次我在我的设计器视图中进行一些更改时...重新生成 Db 上下文代码,它删除了对我明确定义的这些 POCO 的引用。以上问题有什么解决办法吗?
  • 你的数据库上下文构造函数是什么?
  • @marianoc84:添加有问题...

标签: entity-framework entity-framework-5 domain-driven-design entities


【解决方案1】:

问题是,当你对模型进行更改时,实体(类)发生了变化,EF 模型与 DB 不匹配。第一次在应用程序中初始化 DbContext 时,它会检查 EF 模型是否与数据库匹配。如果你更新模型,而不更新数据库,你会得到一个异常。

另一种选择是 marianoc84 答案:在所有迭代中删除并创建数据库,但我必须提出一个更简洁的解决方案:

  1. 忘记设计器视图中的模型
  2. 首先使用纯 EF 代码,即使用代码而不是图表来定义模型
  3. 使用迁移

您可以通过删除来完成任务 1。是的,删除模型。你用的是 DDD,你不需要那个

对于第 2 步,您可以使用“EF Reverse POCO Code First Generator”之类的东西。这将允许您从您的数据库创建一个或多个 Code First 模型(即创建纯 POCO 类,以及它们的 Code First 配置,如列类型和大小、键、关系......)。当您习惯这种工作方式时,您会发现它以更好的方式匹配 DDD,因为您无需修改​​图表,而是直接修改实体(类)并可以将更改移动到 DB(这是第3步)

Setp 3:如果你使用 marianoc84 解决方案,并且只有一个 DbContext,则不需要执行此步骤。如果您有多个上下文,或者不想在启动应用程序时删除并创建数据库,那么您可以使用迁移。通过迁移,您可以发展 Code First 模型并以非破坏性方式将更改应用于数据库。基本上,您可以在 DbContext 和 DB 模式在其原始状态下匹配的初始时刻启用迁移并创建“初始迁移”。您将看到在项目的“迁移”文件夹中创建的文件。从此时起,您可以更改 DbContext 中的类,并创建新的迁移。每个迁移都有“说明”,说明如何将数据库模式从先前的迁移修改为最近创建的(向上),反之亦然(向下),您必须为其命名。当您想要更新数据库时,您只需运行 Update-Database 命令,默认情况下,该命令将更新您的数据库以匹配上次迁移。

事实上,迁移功能更强大:它们允许在迁移之间向上和向下移动,直接在数据库中应用更改,完成,生成 SQL 脚本来更新数据库......谷歌 EF 迁移和你会发现很多关于如何使用它的例子。但也许this is the best information available

注意:正在开发的新 EF 版本可能会被命名为“Entity Framework 7”,没有将 DB 定义为图表的选项:it will be compulsory to use Code First,这是有充分理由的.您可以在ADO.NET blog 中获得大量相关信息。

【讨论】:

  • 我不使用图表来定义模型。我的项目已经有看起来像 DB 实体的实体(除了我的 DB 没有的几个附加字段)然后我想将实体 Fraework 引入我的项目,所以我使用 EF 5 创建了一个 ADO.NET 实体模型,一旦我创建了它(从我的数据库中只带来几个实体)我删除了它创建的实体并更改了上下文文件,以便它定义的实体引用了我在 Project 中已经存在的实体。这是一个很好的 CODE FIRST 方法吗?
  • 我定义的实体也有一些我的数据库表没有的附加字段。 ...这是否意味着如果我不希望将这些附加字段添加到我的表中,我将永远无法对这些实体使用迁移?
  • 也许是,也许不是...... ;) 有几种解决方案。我认为这很重要,足以产生一个新问题。如果你这样做,请告诉我,我会给你一些可能的解决方案。没有人说实施 DDD 很容易,但它有回报。问题不是我不想在评论中回答:问题是这需要更多解释才能在这里做什么,如果它是一个单独的问题,它将对社区更有用。
  • 我一定会提出另一个问题并在这里联系你,:)
【解决方案2】:

尝试将此构造函数添加到您的类中:

public PRISMEntitiesTest(string nameOrConnectionString)
        : this(nameOrConnectionString, new DropCreateDatabaseIfModelChanges<PRISMEntitiesTest>()) { }

DropCreateDatabaseIfModelChangesIDatabaseInitializer 的一个实现,仅当模型在创建数据库后发生更改时,它才会删除、重新创建和可选地重新播种数据库。

这在编码阶段很有用,因为您可以忽略架构问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多