EF代码优先迁移无法编译

本文关键字:编译 迁移 代码 EF | 更新日期: 2023-09-27 18:15:35

我使用EF Code首先生成我的数据库模式(EF 6, . net 4.5.2)。我想插入两个类:

public class MatrixFile
{
    [Key]
    public int Id { get; set; }
    public string FilePath { get; set; }
    public virtual List<MatrixData> Data { get; set; }
}
public class MatrixData
{
    [Key]
    public int Id { get; set; }
    public int OdPairKey { get; set; }
    public double Value { get; set; }
}

这是我的DbContext

public class MyDataContext : DbContext
{
    public virtual DbSet<MatrixFile> MatrixFiles { get; set; }
    public virtual DbSet<MatrixData> MatrixData { get; set; }
}

我尝试通过在包管理器控制台中输入以下命令来在EF中生成DB Schema:

Enable-Migrations
Add-Migration GenerateDatabase

这是EF为我生成的迁移:

public partial class GenerateDatabase : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.MatrixDatas",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    OdPairKey = c.Int(nullable: false),
                    Value = c.Double(nullable: false),
                    MatrixFile_Id = c.Int(),
                })
            .PrimaryKey(t => t.Id)
            .ForeignKey("dbo.MatrixFiles", t => t.MatrixFile_Id)
            .Index(t => t.MatrixFile_Id, name: ""IX_MatrixData_MatrixFile_Id"");
        CreateTable(
            "dbo.MatrixFiles",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    FilePath = c.String(),
                })
            .PrimaryKey(t => t.Id);
    }
    public override void Down()
    {
        DropForeignKey("dbo.MatrixDatas", "MatrixFile_Id", "dbo.MatrixFiles");
        DropIndex("dbo.MatrixDatas", ""IX_MatrixData_MatrixFile_Id"");
        DropTable("dbo.MatrixFiles");
        DropTable("dbo.MatrixDatas");
    }
}

.Index(t => t.MatrixFile_Id, name: ""IX_MatrixData_MatrixFile_Id"");行有一个编译错误,因为IX_MatrixData_MatrixFile_Id周围的双引号。为什么会发生这种情况?我怎样才能让它生成正确的迁移代码,而不需要手动修改迁移?

EF代码优先迁移无法编译

为了进一步解释我对OP的评论,EF在迁移支架中有这个…

// System.Data.Entity.Migrations.Design.CSharpMigrationCodeGenerator
/// <summary>
/// Quotes an identifier using appropriate escaping to allow it to be stored in a string.
/// </summary>
/// <param name="identifier"> The identifier to be quoted. </param>
/// <returns> The quoted identifier. </returns>
protected virtual string Quote(string identifier)
{
    return "'"" + identifier + "'"";
}

…它由表脚手架和索引脚手架调用。这将生成要写入.cs文件的字符串形式的代码…

// System.Data.Entity.Migrations.Design.CSharpMigrationCodeGenerator
private void WriteIndexParameters(CreateIndexOperation createIndexOperation, IndentedTextWriter writer)
{
    if (createIndexOperation.IsUnique)
    {
        writer.Write(", unique: true");
    }
    if (createIndexOperation.IsClustered)
    {
        writer.Write(", clustered: true");
    }
    if (!createIndexOperation.HasDefaultName)
    {
        writer.Write(", name: ");
        writer.Write(this.Quote(createIndexOperation.Name));
    }
}
问题是,如果idenitifier"'"IX_MYIndex'"",您将在代码中获得引号未转义的。你真正需要的——如果你出于任何原因需要引号的话——是"'''"IX_MYIndex'''"",这样转义序列在c#中是有效的。

你说对了@MichaelCoxon。我的意图是使用这个与SQLite最终,我有SQLite.CodeFirst包安装,所以我可以使用它来初始化数据库。我在DataContext中有以下代码:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<EngineDataContext>(modelBuilder);
        Database.SetInitializer(sqliteConnectionInitializer);
    }

似乎产生了恶意代码。删除它/注释掉它可以解决问题。我不知道OnModelCreating会影响EF生成的代码!