Xamarin (forms) iOS Entity Framework 迁移问题 - 实体上没有键(它是)错误

Xamarin (forms) iOS Entity Framework migration issue - no key on entity (it is) error

在我的 DbContext 的构造函数中,对 Database.Migrate 的调用失败告诉我我的实体没有主键(它有,我正在使用 Key 属性)

最初这是在我更新现有应用程序时发生的,但我已经删除了数据库并且它仍在发生。 (迁移应该创建数据库,如果它不存在)。

这只是 iOS 上的一个问题 - Android 迁移需要,没问题。

编辑:我已经回到我知道有效的先前提交(它在应用程序商店中!并且没有任何问题) - 我现在遇到异常在那个版本上也是如此——另外,我将项目复制到另一台机器上(使用旧版本的 VS),当我在 phone 上调试时它也会在那里抛出异常)

配置如下所示:

public class Config
{
    [Key]
    public int ConfigID { get; set; }

    public string Token { get; set; }

    public string DeviceIdentifier { get; set; }
}

迁移如下(但我不认为它实际上达到了迁移的程度,可能是错误的)

public partial class InitialMigration : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Configs",
            columns: table => new
            {
                ConfigID = table.Column<int>(nullable: false)
                    .Annotation("Sqlite:Autoincrement", true),
                Token = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Configs", x => x.ConfigID);
            });
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Configs");
    }
}

并且:

public partial class DiagnosticsAdded : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Diagnostics",
            columns: table => new
            {
                DiagnosticID = table.Column<int>(nullable: false)
                    .Annotation("Sqlite:Autoincrement", true),
                Key = table.Column<string>(nullable: true),
                Value = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Diagnostics", x => x.DiagnosticID);
            });
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Diagnostics");
    }
}

最后:

public partial class DeviceIdentifierAdded : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AddColumn<string>(
            name: "DeviceIdentifier",
            table: "Configs",
            nullable: true);
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropColumn(
            name: "DeviceIdentifier",
            table: "Configs");
    }
}

模型生成器(包括密钥!)

protected override void BuildModel(ModelBuilder modelBuilder)
    {
#pragma warning disable 612, 618
        modelBuilder
            .HasAnnotation("ProductVersion", "3.1.16");

        modelBuilder.Entity("Mobile.Models.Config", b =>
            {
                b.Property<int>("ConfigID")
                    .ValueGeneratedOnAdd()
                    .HasColumnType("INTEGER");

                b.Property<string>("DeviceIdentifier")
                    .HasColumnType("TEXT");

                b.Property<string>("Token")
                    .HasColumnType("TEXT");

                b.HasKey("ConfigID");
                
                b.ToTable("Configs");
            });

        modelBuilder.Entity("Mobile.Models.Diagnostic", b =>
            {
                b.Property<int>("DiagnosticID")
                    .ValueGeneratedOnAdd()
                    .HasColumnType("INTEGER");

                b.Property<string>("Key")
                    .HasColumnType("TEXT");

                b.Property<string>("Value")
                    .HasColumnType("TEXT");

                b.HasKey("DiagnosticID");

                b.ToTable("Diagnostics");
            });

#pragma 警告恢复 612、618 }

问题出在 link 设置上,它被设置为“Link All” - 当我将其更改为“Link Framework SDK's Only”时它工作正常。