gpt4 book ai didi

c# - Entity Framework 自动重命名多对多表而无需任何更改

转载 作者:太空狗 更新时间:2023-10-29 21:26:35 24 4
gpt4 key购买 nike

我在同一个项目中工作了将近 1.5 年,而今天我想向数据库添加更改(代码优先)。突然之间,EF 迁移想要重命名当今数据库中存在的许多多对多表。这些表名已超过 2 年未更改,我不明白为什么 EF 要重命名它们。

我已经检查了迁移所指向的实体文件,没有对可以解释这一点的文件进行更改。在这个项目中,我们使用数据注释,因此我们从未为多对多表提供任何名称,我们只是让 EF 设置表的名称。

RenameTable(name: "dbo.FilterLocation", newName: "LocationFilter");
RenameTable(name: "dbo.FilterCluster", newName: "ClusterFilter");
RenameTable(name: "dbo.ProfileFilter", newName: "FilterProfile");
RenameTable(name: "dbo.HtmlTemplateFilterProfile", newName: "ProfileHtmlTemplateFilter");
RenameTable(name: "dbo.HtmlTemplateProfile", newName: "ProfileHtmlTemplate");
RenameTable(name: "dbo.CategoryHtmlTemplateFilter", newName: "HtmlTemplateFilterCategory");
RenameTable(name: "dbo.HtmlTemplateCategory", newName: "CategoryHtmlTemplate");
DropPrimaryKey("dbo.LocationFilter");
DropPrimaryKey("dbo.ClusterFilter");
DropPrimaryKey("dbo.FilterProfile");
DropPrimaryKey("dbo.ProfileHtmlTemplateFilter");
DropPrimaryKey("dbo.ProfileHtmlTemplate");
DropPrimaryKey("dbo.HtmlTemplateFilterCategory");
DropPrimaryKey("dbo.CategoryHtmlTemplate");
AddPrimaryKey("dbo.LocationFilter", new[] { "Location_LocationId", "Filter_FilterId" });
AddPrimaryKey("dbo.ClusterFilter", new[] { "Cluster_ClusterId", "Filter_FilterId" });
AddPrimaryKey("dbo.FilterProfile", new[] { "Filter_FilterId", "Profile_ProfileId" });
AddPrimaryKey("dbo.ProfileHtmlTemplateFilter", new[] { "Profile_ProfileId", "HtmlTemplateFilter_HtmlTemplateFilterId" });
AddPrimaryKey("dbo.ProfileHtmlTemplate", new[] { "Profile_ProfileId", "HtmlTemplate_HtmlTemplateId" });
AddPrimaryKey("dbo.HtmlTemplateFilterCategory", new[] { "HtmlTemplateFilter_HtmlTemplateFilterId", "Category_CategoryId" });
AddPrimaryKey("dbo.CategoryHtmlTemplate", new[] { "Category_CategoryId", "HtmlTemplate_HtmlTemplateId" });

编辑:

我实际做的修改如下:

AddColumn("dbo.HtmlAdField", "MediaFactConnection", c => c.Int(nullable: false));
AddColumn("dbo.HtmlAd", "FactId", c => c.Int());
CreateIndex("dbo.HtmlAd", "FactId");
AddForeignKey("dbo.HtmlAd", "FactId", "dbo.Fact", "FactId");
DropColumn("dbo.HtmlAdField", "ConnectionState");

最佳答案

对于任何偶然发现这篇文章的人......

与我最初的评论相反,让迁移按生成的方式运行并没有解决我的问题。我发现了这种行为的原因,如何解决它,并吸取了有关从一开始就更明确地配置我的实体的教训。

为什么?

Entity Framework 将根据其算法配置实体的顺序命名和配置联结表。 DbSet<> 的顺序和 modelBuilder “定义”出现了连接表左/右表的变化。我无法确切地确定这对生成的代码有何影响/如何影响,但在我的例子中,在 all-to-easy-to-hit 的 Resharper“代码清理”之后,一切都变成了梨形。

如何修复

通过显式配置多对多映射,您可以模仿 EF 生成在首次创建表时的行为。

这篇文章让我走上了正确的轨道: Creating Many To Many Relationships using Fluent API in Entity Framework

在我的例子中,EF 试图将 RoleCategory 表重命名为 CategoryRole(但失败了)。这是我添加的:

modelBuilder.Entity<Role>()
.HasMany(e => e.Categories)
.WithMany(e => e.Roles)
.Map(m =>
{
m.ToTable("RoleCategory");
});

注意事项

配置“来自”表名中第一个命名的实体。例如为我的 table RoleCategory我这样做了:

Entity<Role>.HasMany(e => e.Categories)

不是

Entity<Category>.HasMany(e => e.Roles)

包括明确的 .WithMany(e => e.Roles)命名另一侧的导航属性。

使用 .Map()指定表名。在我的例子中,当我用 .MapLeftKey() 指定列名时,跟随链接的帖子失败了和 .MapRightKey() .

本质上,我只需要继续修改定义并运行 add-migration每次直到对表的所有操作都从生成的 DbMigration 中消失文件。

我的教训

显然,最佳做法是从一开始就明确配置所有多对多关系。在我的例子中,我没有对联结表中涉及的任何一个实体进行任何更改。然而,对远方“表兄弟”实体的更改和 DbContext 的一些重新排序让我困惑了一段时间。

吸取教训。希望其他人也觉得这有帮助。

关于c# - Entity Framework 自动重命名多对多表而无需任何更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40907503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com