1

EFコードファーストを使用してDBスキーマ(EF 6、.NET 4.5.2)を生成しています。 I私が挿入したい二つのクラスがあります。ここでは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"); 
    } 
} 

IX_MatrixData_MatrixFile_Idの前後に二重引用符があるため、.Index(t => t.MatrixFile_Id, name: ""IX_MatrixData_MatrixFile_Id"");にコンパイルエラーがあります。なぜこうなった?手動で移行をハッキングすることなく正しい移行コードを生成するにはどうすればよいですか?

+1

なぜ地球に何か言い伝えがありますか?ただそれを削除し、それは動作します – Stormhashe

+0

こんにちは@Stormhashe。あなたのコメントは基本的に私の質問を言い換えていますが、スペルや文法はずっと悪いです。私は余分な引用符を取り除くだけでそれを修正できることを知っています。しかし、なぜEFがコードを生成しているのか知っていますか? – Steztric

+0

MSSQLを使用していますか? –

答えて

1

さらにOPに私のコメントを説明するために、EFは...マイグレーション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 + "\""; 
} 

これを持っています...。これはの.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\""であればということです。あなたが本当に必要なもの - 何らかの理由で引用符が必要な場合は、エスケープシーケンスがC#で有効であるように"\\\"IX_MYIndex\\\""です。

0

あなたはお金@MichaelCoxonの権利を持っていました。最終的にSQLiteでこれを使用するつもりでした。SQLite.CodeFirstパッケージがインストールされていましたので、データベースの初期化に使用できます。私はDataContextで次のコードを持っていました:

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

悪意のあるコードを生成しているようです。それを削除する/コメントアウトすることで問題が解決されます。私はOnModelCreatingがEFが生成したコードに影響することを知らなかった!テーブルscaffolderとインデックスscaffolderによって呼び出され

関連する問題