带有新 table 归类错误的 EF 迁移
EF migration with new table collation error
-
entity-framework
-
database-migration
-
entity-framework-migrations
-
entity-framework-6
-
azure-sql-database
我首先使用 Entity Framework 代码,它一直工作正常,直到最近才使用数据库迁移更新数据库...
我重新添加了一个 属性 到 AspNetUser table
public partial class AspNetUser
{
....
public ICollection<Feed> Feeds { get; set; }
}
这是我的新 table
public class Feed
{
public int Id { get; set; }
public string UserId { get; set; }
public AspNetUser User { get; set; }
public MessageType Type { get; set; }
public string Data { get; set; }
public DateTime DateCreated { get; set; }
}
这是生成的 DBMigration 脚本
public override void Up()
{
CreateTable(
"dbo.Feeds",
c => new
{
Id = c.Int(nullable: false, identity: true),
UserId = c.String(nullable: false, maxLength: 128),
Type = c.Int(nullable: false),
Data = c.String(),
DateCreated = c.DateTime(nullable: false),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId);
}
上下文中class:
modelBuilder.Entity<Feed>().HasRequired(x => x.User).WithMany(x => x.Feeds).HasForeignKey(x => x.UserId);
这在本地主机上创建了 table 正常,但是当我部署并 运行 暂存迁移时,我得到的错误是:
列 'dbo.AspNetUsers.Id' 与外键 'FK_dbo.Feeds_dbo.AspNetUsers_UserId' 中引用列 'Feeds.UserId' 的排序规则不同。
无法创建约束或索引。查看以前的错误。
我必须做什么...我已经采用代码优先方法,认为这会更容易,但这确实令人沮丧。
注意:我正在使用 sql Azure
'dbo.AspNetUsers.Id' 和 'Feeds.UserId' 两列的排序规则应该相同,要使它们相同,您可以使用以下示例代码修改其中一列的排序规则:
context.Database.SqlCommand("ALTER TABLE MyTable ALTER COLUMN MyColumn VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CS_AS NULL");
希望这对您有所帮助。
此致,
阿尔贝托·莫里洛
这就是我解决问题的方法,但这绝不是我想要的解决方案。
- 从 azure 导出数据库的 Backpac(通过 azure 门户)
- 将 backpac 导入 SSMS(右键单击数据库 > 导入.. 按照向导操作)
- 在此处更改排序规则,方法是右键单击数据库 > 属性 > 选项 > 排序规则下拉列表。
- 使用 SSMS 导出此 backpac
- 将 backpac(从第 4 步开始)导入 azure 服务器(我使用 SSMS 来完成此操作)
- 将连接字符串指向新数据库。
数据也通过了,所以没有丢失。
我尝试了一些数据库迁移,它们似乎也有效。
使用 EF Core 5(可能还有经典的 EF6),您可以自己声明 FK 字段。
.Property("UserId").UseCollation("SQL_Latin1_General_CP1_CS_AS");
保持您的 .WithMany() 调用不变。
entity-framework
database-migration
entity-framework-migrations
entity-framework-6
azure-sql-database
我首先使用 Entity Framework 代码,它一直工作正常,直到最近才使用数据库迁移更新数据库...
我重新添加了一个 属性 到 AspNetUser table
public partial class AspNetUser
{
....
public ICollection<Feed> Feeds { get; set; }
}
这是我的新 table
public class Feed
{
public int Id { get; set; }
public string UserId { get; set; }
public AspNetUser User { get; set; }
public MessageType Type { get; set; }
public string Data { get; set; }
public DateTime DateCreated { get; set; }
}
这是生成的 DBMigration 脚本
public override void Up()
{
CreateTable(
"dbo.Feeds",
c => new
{
Id = c.Int(nullable: false, identity: true),
UserId = c.String(nullable: false, maxLength: 128),
Type = c.Int(nullable: false),
Data = c.String(),
DateCreated = c.DateTime(nullable: false),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
.Index(t => t.UserId);
}
上下文中class:
modelBuilder.Entity<Feed>().HasRequired(x => x.User).WithMany(x => x.Feeds).HasForeignKey(x => x.UserId);
这在本地主机上创建了 table 正常,但是当我部署并 运行 暂存迁移时,我得到的错误是:
列 'dbo.AspNetUsers.Id' 与外键 'FK_dbo.Feeds_dbo.AspNetUsers_UserId' 中引用列 'Feeds.UserId' 的排序规则不同。 无法创建约束或索引。查看以前的错误。
我必须做什么...我已经采用代码优先方法,认为这会更容易,但这确实令人沮丧。
注意:我正在使用 sql Azure
'dbo.AspNetUsers.Id' 和 'Feeds.UserId' 两列的排序规则应该相同,要使它们相同,您可以使用以下示例代码修改其中一列的排序规则:
context.Database.SqlCommand("ALTER TABLE MyTable ALTER COLUMN MyColumn VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CS_AS NULL");
希望这对您有所帮助。
此致,
阿尔贝托·莫里洛
这就是我解决问题的方法,但这绝不是我想要的解决方案。
- 从 azure 导出数据库的 Backpac(通过 azure 门户)
- 将 backpac 导入 SSMS(右键单击数据库 > 导入.. 按照向导操作)
- 在此处更改排序规则,方法是右键单击数据库 > 属性 > 选项 > 排序规则下拉列表。
- 使用 SSMS 导出此 backpac
- 将 backpac(从第 4 步开始)导入 azure 服务器(我使用 SSMS 来完成此操作)
- 将连接字符串指向新数据库。
数据也通过了,所以没有丢失。
我尝试了一些数据库迁移,它们似乎也有效。
使用 EF Core 5(可能还有经典的 EF6),您可以自己声明 FK 字段。
.Property("UserId").UseCollation("SQL_Latin1_General_CP1_CS_AS");
保持您的 .WithMany() 调用不变。