带有新 table 归类错误的 EF 迁移

EF migration with new table collation error

我首先使用 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");

希望这对您有所帮助。

此致,

阿尔贝托·莫里洛

这就是我解决问题的方法,但这绝不是我想要的解决方案。

  1. 从 azure 导出数据库的 Backpac(通过 azure 门户)
  2. 将 backpac 导入 SSMS(右键单击数据库 > 导入.. 按照向导操作)
  3. 在此处更改排序规则,方法是右键单击数据库 > 属性 > 选项 > 排序规则下拉列表。
  4. 使用 SSMS 导出此 backpac
  5. 将 backpac(从第 4 步开始)导入 azure 服务器(我使用 SSMS 来完成此操作)
  6. 将连接字符串指向新数据库。

数据也通过了,所以没有丢失。

我尝试了一些数据库迁移,它们似乎也有效。

使用 EF Core 5(可能还有经典的 EF6),您可以自己声明 FK 字段。

.Property("UserId").UseCollation("SQL_Latin1_General_CP1_CS_AS");

保持您的 .WithMany() 调用不变。