2015-07-21 10 views
12

हमारे पास नामकरण वस्तुओं का अपना बाहरी सम्मेलन है और मुझे स्वत: जेनरेट की गई विदेशी कुंजी बाधाओं के लिए नामकरण सम्मेलन को बदलने की आवश्यकता है। अब ऐसा लगता है: FK_dbo.City_dbo.CityType_City_CityTypeId लेकिन मुझे इसे City_FKC_CityType कहा जाना चाहिए।विदेशी कुंजी बाधा नामकरण सम्मेलन

मुझे similar question मिला जो कहता है कि आप बाधाओं का नाम मैन्युअल रूप से बदल सकते हैं। हालांकि, यह मेरे अनुरूप नहीं है, क्योंकि मेरे पास बहुत सी टेबल और विदेशी कुंजी बाधाएं हैं।

मुझे "कस्टम कोड प्रथम सम्मेलन" के बारे में कुछ जानकारी मिली और मुझे आश्चर्य है कि क्या मैं इसका उपयोग कर बाधा का नाम बदल सकता हूं या यदि इसे लागू करने के लिए कोई तरीका है?

एक और संस्करण ईएफ का स्रोत कोड डाउनलोड करता है, परिवर्तन करता है और इसका उपयोग करता है लेकिन यह आपात स्थिति के मामले में होता है।

एक साइड नोट के रूप में, मैं प्राथमिक कुंजी के नामकरण सम्मेलन को भी बदलना चाहता हूं। DbConfiguration का उपयोग कर

public class CustomSqlGenerator : SqlServerMigrationSqlGenerator 
{ 
    protected override void Generate(AddForeignKeyOperation addForeignKeyOperation) 
    { 
     addForeignKeyOperation.Name = getFkName(addForeignKeyOperation.PrincipalTable, 
      addForeignKeyOperation.DependentTable, addForeignKeyOperation.DependentColumns.ToArray()); 
     base.Generate(addForeignKeyOperation); 
    } 

    protected override void Generate(DropForeignKeyOperation dropForeignKeyOperation) 
    { 
     dropForeignKeyOperation.Name = getFkName(dropForeignKeyOperation.PrincipalTable, 
      dropForeignKeyOperation.DependentTable, dropForeignKeyOperation.DependentColumns.ToArray()); 
     base.Generate(dropForeignKeyOperation); 
    } 

    private static string getFkName(string primaryKeyTable, string foreignKeyTable, params string[] foreignTableFields) 
    { 
     // Return any format you need 
    } 
} 

तो फिर तुम DbContext में अपने जनरेटर रजिस्टर करने की आवश्यकता:

+1

बोल्ड और इटैलिक का आपका प्रचुर उपयोग मेरी आँखों चोट बनाता है! साथ ही, उस उत्तर में समाधान किस तरह से उपयुक्त नहीं है? यह बहुत आसान है। – DavidG

+0

ठीक है, मैंने इसे बदल दिया :)। मेरे पास बहुत सी टेबल हैं और प्रत्येक तालिका में कुछ बाधा है। प्रत्येक विदेशी कुंजी – Marusyk

उत्तर

7

आप System.Data.Entity.SqlServer नाम स्थान से एक कस्टम एसक्यूएल जनरेटर वर्ग SqlServerMigrationSqlGenerator से प्राप्त लागू कर सकते हैं

public class CustomDbConfiguration : DbConfiguration 
{ 
    public CustomDbConfiguration() 
    { 
     SetMigrationSqlGenerator(SqlProviderServices.ProviderInvariantName, 
      () => new CustomSqlGenerator()); 
    } 
} 

और DbConfigurationTypeAttribute:

[DbConfigurationType(typeof(CustomDbConfiguration))] 
public class YourEntities : DbContext 

अद्यतन: यदि आप एक प्राथमिक कुंजी नाम बदलना चाहते हैं, तो आप Generate तरीकों का पालन ओवरराइड करने के लिए की जरूरत है:

protected override void Generate(CreateTableOperation createTableOperation) 
{ 
    createTableOperation.PrimaryKey.Name = getPkName(createTableOperation.Name); 
    base.Generate(createTableOperation); 
} 

protected override void Generate(AddPrimaryKeyOperation addPrimaryKeyOperation) 
{ 
    addPrimaryKeyOperation.Name = getPkName(addPrimaryKeyOperation.Table); 
    base.Generate(addPrimaryKeyOperation); 
} 

protected override void Generate(DropPrimaryKeyOperation dropPrimaryKeyOperation) 
{ 
    dropPrimaryKeyOperation.Name = getPkName(dropPrimaryKeyOperation.Table); 
    base.Generate(dropPrimaryKeyOperation); 
} 
+0

के लिए नाम बदलने में काफी समय लगेगा, आपको बहुत धन्यवाद। मुझे यही चाहिए, आपने वास्तव में मेरी मदद की। धन्यवाद फिर से – Marusyk

+0

और छोटा सवाल: मैं प्राथमिक कुंजी के लिए भी ऐसा करने की कोशिश कर रहा हूं, लेकिन कुछ गलत है। मैंने 'शून्य उत्पन्न (AddPrimaryKeyOperation addPrimaryKeyOperation)' को ओवरराइड किया और कार्यान्वित किया। क्या आप कृपया मुझे सुझाव दे सकते हैं कि पीके बनाने के दौरान मेरी विधि कभी क्यों नहीं चलती? जब आप मौजूदा इकाई में प्राथमिक कुंजी जोड़ते हैं तो Thx – Marusyk

+1

'AddPrimaryKeyOperation' पीढ़ी निकाल दी जाती है। अधिकांश समय 'CreateTableOperation' पीढ़ी का उपयोग किया जाता है। –

संबंधित मुद्दे