1

Я использую EF Code Сначала для создания моей схемы БД (EF 6, .NET 4.5.2). У меня есть два класса, я хочу, чтобы вставить:EF Code First Migration не скомпилирует

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

Я стараюсь и создать свой DB схемы в EF, введя следующие команды в менеджере пакетов консоли:

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

Почему в земле есть цитата из добула? просто удалите его, и он будет работать – 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\\\"", так что escape-последовательность действительна на C#.

0

Вы были правы на деньги @MichaelCoxon. Мое намерение состояло в том, чтобы использовать это с SQLite в конце концов, и у меня был установлен пакет SQLite.CodeFirst, поэтому я могу использовать его для инициализации базы данных. У меня был следующий код в DataContext:

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

Который, казалось, генерировал код изгоев. Удаление/комментирование устраняет проблему. Я не знал, что OnModelCreating повлияет на код кода EF!

 Смежные вопросы

  • Нет связанных вопросов^_^