1

Ich verwende EF-Code zuerst, um mein DB-Schema zu generieren (EF 6, .NET 4.5.2). Ich habe zwei Klassen I eingefügt werden soll:EF-Code Erste Migration kompiliert nicht

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; } 
} 

Hier mein DbContext

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

Ich versuche, und mein DB-Schema in EF generieren, indem Sie die folgenden Befehle in der Paket-Manager-Konsole eingeben:

Enable-Migrations 
Add-Migration GenerateDatabase 

Dies ist die Migration, dass EF für mich generiert:

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"); 
    } 
} 

Die Zeile .Index(t => t.MatrixFile_Id, name: ""IX_MatrixData_MatrixFile_Id""); hat einen Kompilierungsfehler wegen der doppelten Anführungszeichen um IX_MatrixData_MatrixFile_Id. Warum passiert dies? Wie kann ich den korrekten Migrationscode generieren, ohne die Migration manuell zu hacken?

+1

Warum in der Erde gibt es ein dobule Zitat dort? entfernen Sie es einfach und es wird funktionieren – Stormhashe

+0

Hallo @Stormhashe. Dein Kommentar umformuliert meine Frage grundlegend, aber mit viel schlechterer Rechtschreibung und Grammatik. Ich weiß, dass ich es einfach beheben kann, indem ich die überflüssigen Zitate entferne. Wissen Sie jedoch, warum EF den Code generiert? – Steztric

+0

Verwenden Sie MSSQL? –

Antwort

1

weiter zu meinem Kommentar auf dem OP zu erklären, hat EF dies in der Migrations Scaffolder ...

// 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 + "\""; 
} 

..., die von der Tabelle scaffolder und dem Index scaffolder genannt wird. Dies erzeugt den Code als String in der CS-Datei geschrieben werden ...

// 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)); 
    } 
} 

Das Problem ist, dass, wenn die idenitifier ist "\"IX_MYIndex\"" Sie die Anführungszeichen im Code unescaped erhalten werden. Was Sie wirklich brauchen - wenn Sie aus irgendeinem Grund Zitate benötigen, ist "\\\"IX_MYIndex\\\"", so dass die Escape-Sequenz in C# gültig ist.

0

Sie hatten Recht auf das Geld @MichaelCoxon. Meine Absicht war, dies mit SQLite zu verwenden und ich hatte das SQLite.CodeFirst Paket installiert, damit ich es verwenden kann, um die Datenbank zu initialisieren. Ich hatte den folgenden Code im DataContext:

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

, die den Rogue-Code zu generieren schien. Wenn Sie es entfernen/auskommentieren, wird das Problem behoben. Ich wusste nicht, dass die OnModelCreating beeinflussen würde, welchen Code EF generiert!