我有一个名为“Ciudad”的班级。当我想添加迁移来创建数据表时,EF使用名称“dbo.Ciudads”。我实际上希望这个名字是“Ciudades”(附加'e'),所以我手动改变它。
更新数据库后,表dbo.Ciudades已成功创建。我甚至创建了一个小脚本来填充它,它运行正常。
但是,当我想从上下文中查询“Ciudades”时,我得到一个例外,因为它试图查询实际上不存在的表“dbo.Ciudads”(没有附加的“e”)。这是 InvalidOperationException:“自创建数据库以来,支持'ApplicationDbContext'上下文的模型已更改”
所以我运行了“add-migration foo”并生成以下迁移:
public partial class foo : DbMigration
{
public override void Up()
{
RenameTable(name: "dbo.Ciudads", newName: "Ciudades");
}
public override void Down()
{
RenameTable(name: "dbo.Ciudades", newName: "Ciudads");
}
}
这看起来很奇怪,因为在我的数据库中,我确实按照我想要的名称使用“Ciudades”。然而,当我尝试使用此迁移更新数据库时,我得到以下异常:
System.Data.SqlClient.SqlException(0x80131904):参数@objname不明确或声明的@objtype(OBJECT)错误。
我想我得到了这个例外,因为表“Ciudads”不存在。我是对的吗?
如果是这样,它从哪里获得该表?我在整个解决方案上搜索了“ciudads”这个词,但没有出现。
答案 0 :(得分:1)
感谢@IvanStoev的解决方案。
问题是我在生成的迁移类中手动更改了表名。后来我使用了FluentAPI来指定名称" Ciudades"但是到了晚了。 根据@IvanStoev的建议,我删除了所有内容并再次创建了迁移,但这次是在创建迁移之前使用FluentAPI。然后使用我想要的名称生成该表,现在一切正常。
答案 1 :(得分:0)
您可以使用此方法。
public override void Up()
{
RenameTable("dbo.Ciudads", "Ciudades");
}
public override void Down()
{
RenameTable("dbo.Ciudades", "Ciudads");
}
或者 如果要指定表名。您可以使用流畅的API。
modelBuilder.Entity<Department>().ToTable("t_Department");
答案 2 :(得分:-1)
下载微软SQL服务器管理工作室dev版本可能值得。