2011-05-24 20 views
7

से तालिका का नाम प्राप्त करें मैं कोड प्रथम दृष्टिकोण के साथ इकाई फ्रेमवर्क 4.1 का उपयोग कर रहा हूं। मैं अपने संस्थाओं के भंडारण मॉडल प्रकार और स्तंभ नाम प्राप्त करने में सक्षम हूँ:इकाई फ्रेमवर्क - इकाई

var items = context.ObjectContext.MetadataWorkspace.GetItems<EntityType>(DataSpace.SSpace); 

foreach (var i in items) 
{ 
    Console.WriteLine("Table Name: {0}", i.Name); 

    Console.WriteLine("Keys:"); 
    foreach (var key in i.KeyMembers) 
     Console.WriteLine("\t{0} ({1})", key.Name, key.TypeUsage.EdmType.FullName); 

    Console.WriteLine("Members:"); 
    foreach (var member in i.Members) 
     Console.WriteLine("\t{0} ({1})", member.Name, member.TypeUsage.EdmType.FullName); 
} 

क्या मैं जरूरत वास्तविक तालिका नाम संस्था के लिए मैप किया गया है प्राप्त करने के लिए है। निर्दिष्ट करने के विभिन्न तरीके हैं (फ़्लुएंट-एपीआई का उपयोग करके। टोटेबल(), डेटा एनीोटेशन [टेबल एट्रिब्यूट])।

क्या इस जानकारी को प्राप्त करने का कोई आम तरीका है?

var tables = Context.MetadataWorkspace.GetItems(System.Data.Metadata.Edm.DataSpace.CSpace) 
       .Where(x => (x.MetadataProperties.Contains("NamespaceName") ? String.Compare(x.MetadataProperties["NamespaceName"].Value.ToString(), "Model", true) == 0 : false) 
       && !x.MetadataProperties.Contains("IsForeignKey") 
       && x.MetadataProperties.Contains("KeyMembers")); 

है कि आप तालिका संस्थाओं मिल जाएगा:

उत्तर

10

सबसे आसान तरीका मैं तालिका नाम पाने के लिए मिल गया है निम्नलिखित है। यदि आपके संदर्भ आपको लगता है कि पूर्ववत करने के लिए की आवश्यकता होगी pluralizing

  foreach (var item in tables) 
      { 
       EntityType itemType = (EntityType)item; 
       String TableName = itemType.Name; 
      } 

नोट:

तो फिर तुम नाम निकालने के लिए निम्नलिखित कर सकते हैं।

1

एक अन्य तरीका है कि आप प्राप्त कर सकते हैं ईडीएम तालिका नाम

public static string GetTableName<T>(this ObjectContext context) where T : EntityObject 
    { 
     var entities= context.MetadataWorkspace.GetItems(System.Data.Metadata.Edm.DataSpace.CSpace).Where(b => b.BuiltInTypeKind == BuiltInTypeKind.EntityType); 

     foreach (System.Data.Metadata.Edm.EntityType item in entities) 
     { 
      if(item.FullName==typeof(T).FullName) 
       return item.Name; 
     } 

     return String.Empty; 
    } 
+0

इस के बाद से यह स्कीमा नाम वापस नहीं करता है काम नहीं करता है तालिका – NinjaCross

9

एफई 6.1, कोड-पहला है:

public static string GetTableName<T>(this DbContext context) where T : class 
{ 
    ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext; 
    return objectContext.GetTableName(typeof(T)); 
} 

public static string GetTableName(this DbContext context, Type t) 
{ 
    ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext; 
    return objectContext.GetTableName(t); 
} 

private static readonly Dictionary<Type,string> TableNames = new Dictionary<Type, string>(); 

public static string GetTableName(this ObjectContext context, Type t) 
{ 
    string result; 

    if (!TableNames.TryGetValue(t, out result)) 
    { 
     lock (TableNames) 
     { 
      if (!TableNames.TryGetValue(t, out result)) 
      { 

       string entityName = t.Name; 

       ReadOnlyCollection<EntityContainerMapping> storageMetadata = context.MetadataWorkspace.GetItems<EntityContainerMapping>(DataSpace.CSSpace); 

       foreach (EntityContainerMapping ecm in storageMetadata) 
       { 
        EntitySet entitySet; 
        if (ecm.StoreEntityContainer.TryGetEntitySetByName(entityName, true, out entitySet)) 
        { 
         result = entitySet.Schema + "." + entitySet.Table;//TODO: brackets 
         break; 
        } 
       } 

       TableNames.Add(t,result); 
      } 
     } 
    } 

    return result; 
} 
+0

कृपया कोड पोस्ट करने के बजाय, अपने उत्तर के बारे में कुछ जानकारी शामिल करने पर विचार करें। हम न सिर्फ 'फिक्स' प्रदान करने का प्रयास करते हैं, बल्कि लोगों को सीखने में मदद करते हैं। आपको यह समझाना चाहिए कि मूल कोड में क्या गलत था, आपने अलग-अलग क्या किया, और आपके परिवर्तनों ने क्यों काम किया। –

+2

मैंने सोचा कि "ईएफ 6.1, कोड-फर्स्ट" के साथ शुरू करना काफी ठीक है .... –

+0

मुझे नहीं पता क्यों, यह डीबी-फर्स्ट का उपयोग करके (मेरे लिए) काम नहीं करता है। मेरा जवाब यहां देखें। http://stackoverflow.com/a/32871720/382515 –

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