我们可以使用现有实体实体框架而不是EF生成的实体

时间:2014-12-16 05:13:15

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

我可以使用已作为项目 的一部分的实体作为实体框架实体

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

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

当我在DB Context Class中使用我现有的实体时,如下所示:

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

它给了我以下错误:

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

即使这些实体是由Entity Framework创建的实体的 EXACT Replica ,但我删除了它们

数据库上下文:

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; }
}

2 个答案:

答案 0 :(得分:2)

问题在于,当您在模型中进行更改时,实体(类)会更改,并且EF模型与数据库不匹配。第一次在应用程序中初始化DbContext时,它会检查EF模型是否与数据库匹配。如果您更新模型,并且不更新数据库,您将获得例外。

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

  1. 忘记设计器视图中的模型
  2. 使用纯EF代码优先,即使用代码定义模型,而不是图
  3. 使用迁移
  4. 您可以删除它来执行任务1。是的,删除模型。你正在使用DDD,你不需要那个

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

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

    实际上迁移功能更强大:它们允许向上移动并从迁移到迁移,直接在数据库中应用更改,进行suctomized,生成SQL脚本以更新数据库... Google for EF Migrations和你会发现很多关于如何使用它的例子。但也许this is the best information available

    注意:正在开发的新EF版本,可能名为“Entity Framework 7”,将无法选择将DB定义为图表:it will be compulsory to use Code First,并且有充分的理由为了它。您可以在ADO.NET blog中获得大量有关此内容的信息。

答案 1 :(得分:1)

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

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

DropCreateDatabaseIfModelChanges IDatabaseInitializer的一个实现,只有在创建数据库后模型已更改时,它才会删除,重新创建和重新设置数据库种子。

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