10

Entity Framework(4.3.1)を使い始めたばかりで、MySQL EFプロバイダー(6.5.4)を使用してTPT継承を使用したコードファーストモデルを作成しています。データベース構造を作成しようとすると、MySQLException "Identifier name 'LongClassNameOne_TypeConstraint_From_ClassName2s_To_LongClassNameOnes' is too long"(これは派生クラスのテーブルを親クラスのテーブルに関連付ける関係です)を受け取ります。

   at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
   at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int32& insertedId)
   at MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int32& insertedId)
   at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
   at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
   at MySql.Data.MySqlClient.MySqlScript.Execute()
   at MySql.Data.MySqlClient.MySqlProviderServices.DbCreateDatabase(DbConnection connection, Nullable`1 commandTimeout, StoreItemCollection storeItemCollection)
   at System.Data.Objects.ObjectContext.CreateDatabase()
   at System.Data.Entity.Internal.DatabaseOperations.Create(ObjectContext objectContext)
   at System.Data.Entity.Internal.DatabaseCreator.CreateDatabase(InternalContext internalContext, Func`3 createMigrator, ObjectContext objectContext)
   at System.Data.Entity.Internal.InternalContext.CreateDatabase(ObjectContext objectContext)
   at System.Data.Entity.Database.Create()
   at System.Data.Entity.DropCreateDatabaseAlways`1.InitializeDatabase(TContext context)
   at System.Data.Entity.Database.<>c__DisplayClass2`1.<SetInitializerInternal>b__0(DbContext c)
   at System.Data.Entity.Internal.InternalContext.<>c__DisplayClass8.<PerformDatabaseInitialization>b__6()
   at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)
   at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()
   at System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c)
   at System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()
   at System.Data.Entity.Internal.InternalContext.Initialize()
   at System.Data.Entity.Internal.InternalContext.ForceOSpaceLoadingForKnownEntityTypes()
   at System.Data.Entity.DbContext.System.Data.Entity.Infrastructure.IObjectContextAdapter.get_ObjectContext()
   ...

この名前を制御して短くしたり、64文字の名前制限などに強制的にトリミングしたりするにはどうすればよいですか?

4

2 に答える 2

6

制約の名前を構成する方法がないため、短いテーブル名を使用する必要があります。そのためにクラス名を変更する必要はないことに注意してください。Table 属性を使用するか、OnModelCreating で .ToTable() メソッドを使用できます。

于 2012-04-29T15:23:50.330 に答える
6

以前の私のコメントを拡張するには...

テーブル名を変更するだけで、 OnModelCreating のマッピングを使用できる場合は、as @Pawel suggestedおそらく最も簡単な解決策です。

ただし、リレーションの名前だけを変更したい場合は、

...カスタムSqlGenerator(つまりSqlServerMigrationSqlGenerator)を提供することによりConfiguration()、必要に応じて生成された実際のSQLを細かく管理できます(一般的なケースでは、一般的な自動化されたソリューションになる可能性があります)。例えば

public class MySqlGenerator : SqlServerMigrationSqlGenerator
{
    protected override void Generate(AddForeignKeyOperation addForeignKeyOperation)
    {
        if (addForeignKeyOperation.Name == "LongClassNameOne_TypeConstraint_From_ClassName2s_To_LongClassNameOnes")
            addForeignKeyOperation.Name = "MyCustomFKName";
        // addForeignKeyOperation.Name = "Test" + addForeignKeyOperation.Name;
        base.Generate(addForeignKeyOperation);
    }
}

...またはそれらの線に沿った何か(一致する必要があり、正しい命名を見つけるか、必要に応じて比較しName Lengthて短くする必要があります。そして、構成(移行によって生成されたファイル)で...

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    SetSqlGenerator("MySqlMigrationSqlGenerator", new MySqlGenerator());
    // SetSqlGenerator("System.Data.SqlClient", new MySqlGenerator());
}

(注:確かなことはわかりませんが、(@Mariusz Jamroによって)MySQLプロバイダーの名前が であることが示唆されました 、MySqlMigrationSqlGenerator理にかなっていると思います)

...これはリレーションの FK を変更する必要があります。リレーション名は C# のモデルでは実際には使用されないため (通常は db 名のみ)、これを高速にテストできる限り問題なく動作します。

于 2012-04-29T18:02:21.317 に答える