2013-08-29 10 views
21

मैं EntityFramework 4 (EF) के माध्यम से एक एसक्यूएल सर्वर डाटाबेस में एक वस्तु डालने कर रहा हूँ के साथ स्तंभ को अद्यतन करने के लिए नहीं। प्राप्त करने वाली तालिका में (CreatedDate) का एक कॉलम है, जिसका डिफ़ॉल्ट मान getdate() पर सेट है। इसलिए मैं इसे ईएफ को प्रदान नहीं करता मानता हूं कि इसका मान SQL सर्वर द्वारा getdate() पर डिफ़ॉल्ट किया जाएगा।EntityFramework डिफ़ॉल्ट मान

हालांकि ऐसा नहीं होता है; इसके बजाय ईएफ एक सत्यापन त्रुटि एन SaveChanges() लौटाता है।

तो ऐसा कोई कारण है कि आप हो रहा के लिए पता है? कृपया मुझे बताओ।

बहुत धन्यवाद।

+0

मुझे लगता है कि यह आपकी मदद करनी चाहिए http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/ – V4Vendetta

+0

यहां उच्चतम रेटेड उत्तर यहां सहायता कर सकता है: http://stackoverflow.com/questions/14385477/adding-createddate-to-an-entity-using-entity-framework-5-code- पहला (शायद नहीं)। – Chris

उत्तर

13

आप (जैसे एक बनाया तारीख के साथ) है कि मूल्य संपादित करना चाहते हैं कभी नहीं हैं, तो आप उपयोग कर सकते हैं:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public virtual DateTime CreatedDate { get; set; } 

इस इकाई की रूपरेखा बता देंगे कि मूल्य डेटाबेस द्वारा नियंत्रित किया जाता है, लेकिन अभी लायेगा महत्व।

ध्यान दें कि आप फिर उस मूल्य को बदल नहीं सकते, इसलिए यह एक समाधान नहीं है, तो आप बस एक प्रारंभिक मूल्य चाहते हैं।

तुम सिर्फ एक डिफ़ॉल्ट मान चाहते हैं, लेकिन अभी भी इसे संपादित करने की अनुमति है, या आप इकाई की रूपरेखा 5 और प्रयोग कर रहे हैं नीचे, आप कोड में डिफ़ॉल्ट सेट करना होगा। इस बारे में यहाँ

अधिक चर्चा:

How to use Default column value from DataBase in Entity Framework?

+0

सच नहीं है। तुम यह केर सकते हो। प्रश्न का मेरा जवाब देखें। – kkahl

+0

सहमत नहीं है लेकिन – HostMyBus

+0

@kkahl से नीचे @ सीपीआरबीबी का जवाब देखें, यह लिखने के समय सच था, – mattmanser

2

बस [DatabaseGenerated(DatabaseGeneratedOption.Identity)] विशेषता के लिए स्तंभ मैदान पर अपने इकाई वस्तु परिभाषा लागू होते हैं।

उदाहरण के लिए:

public class SomeTable 
{ 
    ... 

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public DateTime CreatedDate { get; set; } 

    ... 
} 

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

+0

मेरे लिए काम नहीं कर रहा है - मेरे पास मेरी तालिका में तीन डिफ़ॉल्ट मान हैं ('NEWID()', ' SYSTEM_USER', और 'GETDATE() '), मैंने इनमें से प्रत्येक फ़ील्ड को' [डेटाबेस जेनरेटेड (डेटाबेस जेनरेटेडऑप्शन.इडेन्टिटी)] 'के साथ चिह्नित किया है, और मुझे त्रुटि मिलती है' सत्यापन एक या अधिक इकाइयों के लिए विफल रहा। अधिक जानकारी के लिए 'EntityValidationErrors' प्रॉपर्टी देखें। '। – alex

+0

आप निश्चित रूप से डीबगर में शामिल होना चाहते हैं और अपवाद से जुड़ी अतिरिक्त जानकारी (EntityValidationErrors प्रॉपर्टी में) देखें। यह संभव है कि EntityFramework कॉलम मानों में से किसी एक को पार्स/समझने में असफल रहा हो। मेरा अनुभव बताता है कि आप अपराधी को खोजने के लिए एक बार इन्हें जोड़ने का प्रयास करना चाह सकते हैं। मैं अनुमान लगा रहा हूं कि यह तिथि कॉलम से संबंधित सबसे अधिक संभावना है, जो सहायक होनी चाहिए लेकिन मिश्रण में उपलब्ध कई तारीख प्रारूप और संरचनाएं होने के बाद से सही हो सकती है। – kkahl

+0

जब आप यहां सही रास्ते पर हैं, तो डेटा एनोटेशन का उपयोग करके सही उत्तर @CptRobby का उत्तर है: [डेटाबेस जेनरेटेड (डेटाबेस जेनरेटेडऑप्शन.कंप्यूटेड)] – HostMyBus

0

मैं एक नया वेरिएबल घोषित काम करते हैं और वर्तमान समय के लिए है कि चर सेट करने के लिए प्राप्त करने के लिए। फिर डेटा डालने पर मैंने चर को कॉलम में संदर्भित किया:

var db = new YourTableEntities(); 
var dateNow = DateTime.Now; 

db.YourTableEntities.Add(new YourTableEntities() 
{ 
    ColumnAInTable = someAVariable, 
    ColumnBInTable = someBVariable, 
    ColumnThatShouldDefaultToGetDate = dateNow 
}); 

आशा है कि इससे मदद मिलती है!

2

इस मुद्दे पर सही उत्तर इकाई की रूपरेखा बताने के लिए है कि स्तंभ गणना की जाती है है।

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public virtual DateTime CreatedDate { get; set; } 

DatabaseGeneratedOption.Computed मतलब है कि यह डेटाबेस द्वारा निर्धारित है और इकाई की रूपरेखा द्वारा बदला नहीं जा सकता है। DatabaseGeneratedOption.Identity का अर्थ है कि कॉलम IDENTITY कॉलम है, जिसका उपयोग केवल संख्यात्मक प्राथमिक कुंजी को स्वत: संक्रमित करने के लिए किया जाना चाहिए।

** ध्यान दें कि DatabaseGeneratedOption enumeration के लिए प्रलेखन पहचान कॉलम के बारे में कुछ भी नहीं बताता है (आंशिक रूप से क्योंकि यह एक SQL सर्वर विशिष्ट आरोपण विवरण है)। इसके बजाए यह पहचान विकल्प को परिभाषित करता है "जब पंक्ति एक पंक्ति डाली जाती है तो डेटाबेस एक मान उत्पन्न करता है।" मैं वास्तव में एक रिकॉर्ड की स्थापना करते समय एक डिफॉल्ट बाधा का उपयोग करके एक मोडडेट को सेट करने की अनुमति देने के लिए एक तरीका ढूंढ रहा था, लेकिन रिकॉर्ड अपडेट करते समय इसे इकाई फ्रेमवर्क से संशोधित करने की अनुमति देने के लिए।इसलिए विवरण के कारण, मैंने सोचा कि मुझे एक समाधान मिल गया है, लेकिन DatabaseGeneratedOption.Identity के साथ ध्वजांकित होने पर रिकॉर्ड के मोडडेट को संशोधित करने का प्रयास अपवाद को फेंक दिया। तो वहां कोई भाग्य नहीं है।

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