c# - Entity Framework - 代码优先方法

标签 c# sql sql-server entity-framework

我只是在我的项目中遵循 Entity Framework 代码优先方法,我遇到了一些问题。我总是被迫使用命令重新生成数据库。但是,现在我设法变得稳定了。我有一个场景,在这个场景中,框架正在创建一个迁移脚本是不合逻辑的,可能是我遗漏了一些东西,需要你的帮助

场景是——我启用了迁移,它创建了一个包含我所有表设置的 InitialCreate 类,我对此印象深刻。但是当我对实体进行更改时,例如,我有 Deal Class

我添加了名为 LenderName、BorrowerName 的新属性,并运行添加迁移脚本,它为我创建了一个迁移脚本,

 public partial class LenderBorrowerName : DbMigration
    {
        public override void Up()
        {
            DropColumn("dbo.Deals", "LenderName");
            DropColumn("dbo.Deals", "BorrowerName");
            DropColumn("dbo.Deals", "Discriminator");
        }

        public override void Down()
        {
            AddColumn("dbo.Deals", "Discriminator", c => c.String(nullable: false, maxLength: 128));
            AddColumn("dbo.Deals", "BorrowerName", c => c.String());
            AddColumn("dbo.Deals", "LenderName", c => c.String());
        }
    }

问题是,原始数据库没有这个字段,它应该通过这个迁移脚本添加到数据库中。要更新这些字段,如果我运行 update-migration -force,它会因为上面的 up() 函数而失败,因为它试图从表中删除列。微软为什么要添加那个删除脚本,开发人员需要手动删除吗?请帮忙

最佳答案

这里的提示是 Discriminator柱子。 EF 应用默认策略来实现继承,称为 TPH,Table-Per-Hierarchy。 Discriminator当您在实体之间继承时,字段由 EF 自动生成。

与将这两个属性添加到现有实体相比,您在模型中所做的更改似乎更多:您可能将它们从派生类移到了基类,或者相反。看来你的 DbContext只包含一个 DbSet用于基本实体或派生实体,但不能同时用于两者。请注意,默认情况下迁移仅包括您的 DbContext 中包含的实体。作为DbSets (您也可以在映射中明确包含或排除它们)。因此,您的迁移只会为您的 DbContext 中的实体生成字段。 ,而不是另一个,EF 正在解释您删除了这些属性,这就是为什么您得到 DropColumn 的原因句子。

所以这里的解决方案是添加缺失的 DbSetDbContext并再次生成迁移。

Here您可以获得有关 TPH 的更多信息。

另一种解释可能是在运行 Update-Database 之后和 Add-Migration几次并使用 -force参数您的数据库已处于与您的内容不一致的状态 __MigrationHistory table 。我的建议是手动删除数据库,如果可能的话,生成一个干净的 Initial迁移并运行它。

关于c# - Entity Framework - 代码优先方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40699523/

相关文章:

javascript - 服务器端的 AngularJS 变量

sql - 使用 SQL 中嵌入的 R 进行累积测量

R 中的 sqlquery 不返回查询中的所有行

javascript - C# 下拉列表项颜色在选中时不显示

c# - 处理来自 Slack 的发布请求

c# - 添加 : notation to C# for indexing into arrays

sql - 数据库处于恢复状态

php - 确定 WHERE 语句的哪些部分失败

sql-server - Sqoop 无法从 Sql Server 导入数据

Java/SQL -executeUpdate() 挂起并导致 OutOfMemoryException