2010-08-23 19 views
8

मेरी सभी इकाइयों में संपत्ति आईडी है। डेटाबेस में मेरे सभी टेबलों में प्राथमिक कुंजी के रूप में स्वत: जेनरेट पूर्णांक पहचान आईडी है।ईएफ जेनेरिक रिपोजिटरी नई डाली गई जेनेरिक इकाई से आईडी प्राप्त करें

मेरे पास संस्थाएं बनाने के लिए सामान्य विधि है।

क्या डेटाबेस में डाली गई इकाई के बाद इकाई आईडी प्राप्त करने का कोई तरीका है?

public override int Create<T>(T entity) 
    { 
     string entitySet = GetEntitySetName<T>(); 
     _context.AddObject(entitySet, entity); 
     _context.SaveChanges(); 

     return <Id Here>; //TODO Return Id here 
    } 

सरल (सामान्य नहीं) भंडार में मैं सिर्फ Entity.Id वापस आ सकते हैं, लेकिन कैसे सामान्य भंडार में समान व्यवहार प्राप्त करने के लिए? मेरे पास उन सभी इकाइयों के लिए आधार इकाई वर्ग हो सकता है जिनमें int संपत्ति आईडी शामिल है लेकिन क्या यह विरासत को लागू किए बिना इसे काम करने का कोई तरीका है?

उत्तर

3

समाधान:

public override TR Create<T, TR>(T entity) 
    { 
     string entitySet = GetEntitySetName<T>(); 
     _context.AddObject(entitySet, entity); 
     _context.SaveChanges(); 

     //Returns primaryKey value 
     return (TR)context.CreateEntityKey(entitySet, entity).EntityKeyValues[0].Value;      
    } 

कहाँ टी: इकाई प्रकार, टी.आर.: इकाई पी प्रकार।

+0

क्या savechanges को कॉल करने से पहले आईडी प्राप्त करना संभव है? – Jeroen

+0

@Jeroen ऐसा करने के दो तरीके हैं, यदि आप उस मामले में पीके के रूप में int का उपयोग करना चाहते हैं तो पहले आपको डेटाबेस द्वारा जेनरेट किया गया नया आईडी प्राप्त करने के लिए खाली रिकॉर्ड डालना होगा, अन्यथा आप पीआई के रूप में ग्रिड का उपयोग कर सकते हैं, उस स्थिति में Guid.NewGuid() – Kuncevic

+0

पर कॉल करके पीके के सीधे अपने कोड में उत्पन्न कर सकते हैं कृपया अपने 'बनाएं()' फ़ंक्शन को कॉल करने के तरीके को दिखाएं जो पीके मान वापस कर देगा। धन्यवाद –

4

पीओसीओ इकाइयों के साथ, आपको एक इंटरफेस, प्रतिबिंब, या dynamic का उपयोग करना होगा।

EntityObject इकाइयों के साथ आप EntityKey संपत्ति पढ़ सकते हैं।

+0

धन्यवाद, इंटरफ़ेस बेहतर तरीका है, लेकिन अस्थायी मैं गतिशील के साथ जाऊंगा। 'गतिशील वर्तमान एंटीटी = इकाई;' 'वापसी वर्तमान एंटीटी.आईडी;' – Kuncevic

16

यह वास्तव में मृत सरल हो सकता है;

// Project is is object/table, no POCO here. 

var newProj = new Project(); 
newProj.Name = "Blah project"; 

var db = new AppDataContextname(); 

db.Projects.AddObject(newProj); 

// at this point, newProj.ID is NOT set 

db.SaveChanges(); // record is added to db. 
// now, the ID property of the Project object is set!!! 

// if the last ID in that table is '25', and you have auto-increment, 
// then the object's ID property will now be 26! 
Console.WriteLine(newProj.ID); // will output "26" 

कैसे जब तक मैंने महसूस किया कि इसके बाद के संस्करण कोड काम करता है एक लंबे समय के लिए वापस पाने के लिए आईडी पर मेरे दिमाग racked। लिंक-टू-एसक्यूएल और ईएफ 4 में काम करता है।

1
With reflection you can obtain the Id property. 


public override int Create<T>(T entity) 
    { 
     string entitySet = GetEntitySetName<T>(); 
     _context.AddObject(entitySet, entity); 
     _context.SaveChanges(); 

     var idProperty = item.GetType().GetProperty("Id").GetValue(entity,null); 
     return (int)idProperty; 
    } 
+0

यह काम करता है लेकिन यह एक प्रदर्शन ड्रैग हो सकता है .. प्रतिबिंब धीमा है (कई तर्क)। –

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