Другим решением было бы переопределить генератор SQL Firebird.
Если вы не хотите снова создавать целую логику для генерации SQL, вы можете создать класс, который происходит из FbMigrationSqlGenerator, и просто переопределить методы, которые вы хотите.
Ниже я использую короткую логику имени таблицы для создания внешних ключей:
public class FirebirdSqlGenerator : FbMigrationSqlGenerator
{
protected override IEnumerable<MigrationStatement> Generate(AddForeignKeyOperation operation)
{
// Reduce the name using this method
operation.Name = GenerateForeignKeyNameFromOperation(operation);
using (var writer = SqlWriter())
{
writer.Write("ALTER TABLE ");
writer.Write(Quote(CheckName(ExtractName(operation.DependentTable))));
writer.Write(" ADD CONSTRAINT ");
writer.Write(Quote(CheckName(CreateItemName(operation.Name))));
writer.Write(" FOREIGN KEY (");
WriteColumns(writer, operation.DependentColumns.Select(Quote));
writer.Write(") REFERENCES ");
writer.Write(Quote(CheckName(ExtractName(operation.PrincipalTable))));
writer.Write(" (");
WriteColumns(writer, operation.PrincipalColumns.Select(Quote));
writer.Write(")");
if (operation.CascadeDelete)
{
writer.Write(" ON DELETE CASCADE");
}
yield return Statement(writer.ToString());
}
}
public string GenerateForeignKeyNameFromOperation(AddForeignKeyOperation foreignKeyOperation)
{
var depTable = GetShortNameFromTableName(CreateItemName(foreignKeyOperation.DependentTable));
foreignKeyOperation.Name = "FK_" +
depTable +
"_" +
GetShortNameFromTableName(CreateItemName(foreignKeyOperation.PrincipalTable)) +
"_" +
String.Join("_", foreignKeyOperation.DependentColumns);
return foreignKeyOperation.Name;
}
[...]
}
набора это, как вы SQL Generator с помощью метода SetSqlGenerator.Он будет выглядеть следующим образом:
internal sealed class MyConfiguration : DbMigrationsConfiguration<MyDbContext>
{
private string firebirdProviderInvariantName = "FirebirdSql.Data.FirebirdClient";
/// <summary>
/// Initializes a new instance of the <see cref="Configuration"/> class.
/// </summary>
public MyConfiguration()
{
SetSqlGenerator(firebirdProviderInvariantName, new FirebirdSqlGenerator();
}
}
Extra подсказка: Если вы хотите отлаживать код для проверки проблем, которые вы можете добавить следующие строки в методе Generate:
if (System.Diagnostics.Debugger.IsAttached == false)
System.Diagnostics.Debugger.Launch();
System.Diagnostics.Debugger.Break();
Это запустит Debug который можно поймать в другом экземпляре Visual Studio.
Некоторые другие страницы, которые могут вам помочь: Firebird Repo: https://github.com/cincuranet/FirebirdSql.Data.FirebirdClient EF Repo: https://github.com/aspnet/EntityFramework6
Я надеюсь, что это помогает.
вы можете настроить имя внешнего ключа в разделе «Конфигурация имен нетрадиционных иностранных ключей» ** (https://msdn.microsoft.com/en-us/data/hh134698.aspx) –
@ kienct89 thx, я буду попробуйте – whizzzkey