1

我使用EF代碼優先生成我的DB架構(EF 6,.NET 4.5.2)。我有兩個班我想插入:EF代碼優先遷移不編譯

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模式:

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左右的雙引號引起編譯錯誤。這是爲什麼發生?我怎樣才能獲得它來生成正確的移植代碼,而無需手動侵入遷移?

+1

爲什麼地球上有一個dobule報價呢?只是刪除它,它會工作 – Stormhashe

+0

嗨@Stormhashe。您的評論基本上重述了我的問題,但拼寫和語法更差。我知道我可以通過刪除多餘的引號來修復它。但是,你知道EF爲什麼生成代碼嗎? – Steztric

+0

你在使用MSSQL嗎? –

回答

1

進一步解釋,我在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#中有效。

0

你是對的錢@MichaelCoxon。我的意圖是最終將這與SQLite結合使用,並且我安裝了SQLite.CodeFirst軟件包,以便我可以使用它來初始化數據庫。我在DataContext中有以下代碼:

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

這似乎會產生惡意代碼。刪除/評論它可以解決問題。我不知道OnModelCreating會影響EF生成的代碼!