我可以使用已作为项目 的一部分的实体作为实体框架实体 。
我的项目遵循域驱动设计,其中包含代表我的数据库表的所有实体。
我不希望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; }
}
答案 0 :(得分:2)
问题在于,当您在模型中进行更改时,实体(类)会更改,并且EF模型与数据库不匹配。第一次在应用程序中初始化DbContext
时,它会检查EF模型是否与数据库匹配。如果您更新模型,并且不更新数据库,您将获得例外。
另一种选择是marianoc84回答:在所有迭代中删除并创建数据库,但我必须提出一个更清洁的解决方案:
您可以删除它来执行任务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的一个实现,只有在创建数据库后模型已更改时,它才会删除,重新创建和重新设置数据库种子。
这在编码阶段非常有用,因为您可以忽略架构问题。