2010-02-15 7 views
6

मेरे पास वीएस 2010 आरसी का उपयोग करके एंटीटी फ्रेमवर्क 4 द्वारा उत्पादित देश के लिए एक साधारण इकाई है। यह नीचे पीओसीओ की तरह कुछ दिखता है।एंटिटी फ्रेमवर्क 4 - हमेशा लागू करने वाले बूलियन प्रॉपर्टी को अपडेट नहीं कर रहा है ApplyCurrentValues ​​

public class Company 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string ISOCode { get; set; } 
    public boolean Active { get; set; } 
} 

मेरा भंडार कोड नीचे है। 'डीबी' मेरा एक संदर्भ है जिसे कन्स्ट्रक्टर में शुरू किया गया है।

public void EditCountry(Country countryToEdit) 
{ 
    db.Countries.Attach(new Country { ID = countryToEdit.ID }); 
    db.Countries.ApplyCurrentValues(countryToEdit); 
    db.SaveChanges(); 
} 

countryToEdit में को असत्य से सत्य सक्रिय क्षेत्र बदलने निम्नलिखित एसक्यूएल

update [dbo].[Countries] 
set [Name] = @0, [ISOCode] = @1, [Active] = @2 
where ([ID] = @3) 
@0 nvarchar(256),@1 nvarchar(12),@2 bit,@3 int,@0='Algeria',@1='DZ',@2=1,@3=4 

यह आशा की जाती है पैदा करता है।

अगर मैं countryToEdit में गलत पर सच से सक्रिय क्षेत्र बदलने के निम्नलिखित एसक्यूएल

update [dbo].[Countries] 
set [Name] = @0, [ISOCode] = @1 
where ([ID] = @2) 
@0 nvarchar(256),@1 nvarchar(12),@2 int,@0='Afghanistann',@1='AF',@2=1 

उत्पादन किया जाता है सक्रिय क्षेत्र अद्यतन करने के लिए किए गए कोई प्रयास नहीं है।

उत्तर

7

यह ApplyCurrentValues in EF 4 प्रश्न का उत्तर है।

यह

db.Countries.Attach(db.Countries.Single(c => c.ID == countryToEdit.ID)); 

हो तुम एक खाली ठूंठ वस्तु बूलियन क्षेत्रों गलत पर initialised कर रहे हैं संलग्न करते हैं चाहिए। ApplyCurrentValues ​​कॉल स्टब और संपादित ऑब्जेक्ट के बीच बूलियन मान में कोई परिवर्तन नहीं देखता है।

ऊपर दिया गया कोड एक और डीबी क्वेरी जोड़ता है, लेकिन मैं इसके साथ रह सकता हूं।

+1

यदि आप अपनी संपत्तियों को निरर्थक बूल में बदलने में सक्षम हैं तो भी आप स्टब इकाई दृष्टिकोण का उपयोग कर सकते हैं। डिफ़ॉल्ट मान तब शून्य होगा और ApplyCurrentValues ​​वर्तमान इकाई पर झूठ पर झुकाव से संशोधन को संशोधित करेगा और अद्यतन के लिए अतिरिक्त एसक्यूएल उत्सर्जित करेगा। –

0

डेटाबेस (चयन, और अद्यतन) में दो यात्राओं से बचने के लिए आप दो बार बूलियन मान संशोधित कर सकते हैं।

उदाहरण:

public void EditCountry(Country countryToEdit) 
{ 
    db.Countries.Attach(new Country 
    { 
     ID = countryToEdit.ID, 
     Active = !countryToEdit.Active 
    }); 
    db.Countries.ApplyCurrentValues(countryToEdit); 
    db.SaveChanges(); 
} 

क्या यह झंडा इकाई की रूपरेखा है कि क्षेत्र अद्यतन किया गया है इच्छा को अपडेट किया जाएगा के विपरीत करने के लिए अपने बूलियन का डिफ़ॉल्ट मान सेट करना।

मुझे पता है कि यह सबसे अच्छा दिखने वाला कोड नहीं है; और किसी अन्य डेवलपर के लिए भ्रम पैदा कर सकता है, लेकिन इसकी संभावना सबसे अच्छी प्रदर्शन होगी क्योंकि आपको डेटाबेस को दो बार मारना नहीं है।

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