2012-07-06 9 views
14

के साथ कोई प्राथमिक कुंजी वाले दृश्य का उपयोग करके मैंने कच्चे ADO.NET और एम्बेडेड एसक्यूएल से एंटिटी में एक एप्लिकेशन को परिवर्तित करने के लिए एक प्रोजेक्ट शुरू किया। मैं एप्लिकेशन द्वारा उपयोग किए गए विचारों में से एक के साथ एक समस्या में भाग गया। दृश्य में कोई प्राथमिक कुंजी नहीं है और कोई कॉलम नहीं है (या कॉलम का संयोजन) जो विशिष्ट रूप से एक पंक्ति की पहचान करता है। यहाँएंटिटी

SELECT 
    filingmonth, 
    CEIL(filingmonth/3), 
    licnum, 
    filingyear, 
    DECODE(GROUPING(insurername), '1', '- All Insured -', insurername), 
    insurername, 
    policylinecode, 
    linedescription, 
    SUM(NVL(grosspremium, 0)), 
    SUM(DECODE(taxexempt, 1, grosspremium, 0)), 
    TRUNC(
     CASE 
     WHEN 
      (
      b.rsn IS NOT NULL 
      OR A.zeroreport = 1 
     ) 
      AND b.datereceived IS NULL 
      THEN A.datereceived 
     ELSE b.datereceived 
     END), 
    SUM(aip.iscompanyadmitted(b.naiccocode, b.naicalienid)), 
    A.insuredid 
    FROM 
    aip.slbtransinsured A 
    LEFT OUTER JOIN aip.slbtransinsurer b 
    ON 
    A.insuredid = b.insuredid 
    LEFT OUTER JOIN aip.slblinecodes C 
    ON 
    b.policylinecode = C.linecode 
    WHERE 
    A.submitted = 1 
    AND A.entryincomplete = 0 
    GROUP BY 
    licnum, 
    filingmonth, 
    filingyear, 
    TRUNC(
     CASE 
     WHEN 
      (
      b.rsn IS NOT NULL 
      OR A.zeroreport = 1 
     ) 
      AND b.datereceived IS NULL 
      THEN A.datereceived 
     ELSE b.datereceived 
     END), 
    ROLLUP(insurername, aip.iscompanyadmitted(b.naiccocode, b.naicalienid), 
    policylinecode, linedescription), A.insuredid; 

और कुछ नमूना दिखा कुछ पंक्तियों को पूरी तरह से दोहराया गया है देखते हैं कि डेटा है (पंक्तियाँ 3 और 4):: यहाँ चुनिंदा दृश्य के साथ बनाया जाता है

FILINGMONTH CEIL(FILINGMONTH/3) LICNUM FILINGYEAR DECODE(GROUPING(INSURERNAME),'1','-ALLINSURED-',INSURERNAME)           INSURERNAME                       POLICYLINECODE LINEDESCRIPTION                                               SUM(NVL(GROSSPREMIUM,0)) SUM(DECODE(TAXEXEMPT,1,GROSSPREMIUM,0)) TRUNC(CASEWHEN(B.RSNISNOTNULLORA.ZEROREPORT=1)ANDB.DATERECEIVEDISNULLTHENA.DATERECEIVEDELSEB.DATERECEIVEDEND) SUM(AIP.ISCOMPANYADMITTED(B.NAICCOCODE,B.NAICALIENID)) INSUREDID 

     6     2 8150  2007 SAVERS PROPERTY AND CASUALTY INSURANCE CO               SAVERS PROPERTY AND CASUALTY INSURANCE CO               17    OTHER LIABILITY                                                   721.25          0 18-JUL-07                                       0  81 
     6     2 8150  2007 SAVERS PROPERTY AND CASUALTY INSURANCE CO               SAVERS PROPERTY AND CASUALTY INSURANCE CO               17                                                          721.25          0 18-JUL-07                                       0  81 
     6     2 8150  2007 SAVERS PROPERTY AND CASUALTY INSURANCE CO               SAVERS PROPERTY AND CASUALTY INSURANCE CO                                                                          721.25          0 18-JUL-07                                       0  81 
     6     2 8150  2007 SAVERS PROPERTY AND CASUALTY INSURANCE CO               SAVERS PROPERTY AND CASUALTY INSURANCE CO                                                                          721.25          0 18-JUL-07                                       0  81 

insuredid है aip.slbtransinsured तालिका के लिए pk, rsn aip.slbtransinsurer और aip.slblinecodes के लिए pk है।

क्या एक अद्वितीय पहचानकर्ता के बिना इकाई मॉडल में कोई दृश्य जोड़ना संभव है? या दृश्य में एक अद्वितीय पंक्ति पहचानकर्ता जोड़ने का कोई आसान तरीका है? दृश्य केवल पढ़ने के लिए लिखा है, कभी नहीं लिखा है।

उत्तर

23

यह एक अद्वितीय पहचानकर्ता के बिना इकाई मॉडल के लिए एक दृश्य को जोड़ने के लिए बिल्कुल भी संभव है?

यदि प्राथमिक कुंजी के बिना, नहीं। यही कारण है कि error इस तरह के परिणाम होगा: मॉडल पीढ़ी के दौरान

एक या अधिक सत्यापन त्रुटियों का पता चला गया:

System.Data.Edm.EdmEntityType: EntityType 'SalesOnEachCountry' है कोई कुंजी परिभाषित किया। इस EntityType के लिए कुंजी परिभाषित करें। System.Data.Edm.EdmEntitySet: EntityType: EntitySet SalesOnEachCountryList SalesOnEachCountry प्रकार पर आधारित है जिसमें कुंजी परिभाषित नहीं है।

यदि एक अद्वितीय पहचानकर्ता के बिना, हाँ, यद्यपि इसमें एक गैर-वांछनीय आउटपुट है।एक ही पहचानकर्ता के साथ रिकार्ड एक ही वस्तु, इस Identity Map Pattern

एक उदाहरण कहा जाता है को संदर्भित हैं, भले ही आपके विचार इन दोनों पंक्तियों का उत्पादन:

Country  Year TotalSales 
Philippines 2010 20.000000 
Philippines 2011 40.000000 

तुम सिर्फ केवल देश मैदान पर प्राथमिक कुंजी के नक्शे जाएगा जैसे

public class SalesOnEachCountry 
{   
    [Key] 
    public int CountryId { get; set; } 
    public string CountryName { get; set; }   
    public int OrYear { get; set; } 
    public long SalesCount { get; set; } 
    public decimal TotalSales { get; set; } 
} 

, यहां तक ​​कि आपके विचार आपके ओरेकल क्वेरी संपादक पर ऊपर दो पंक्तियों पैदा करता है, इकाई की रूपरेखा यह गलत उत्पादन का उत्पादन:

Country  Year TotalSales 
Philippines 2010 20.000000 
Philippines 2010 20.000000 

इकाई की रूपरेखा लगेगा कि दूसरी पंक्ति पहले के रूप में एक ही वस्तु है पंक्ति।

विशिष्टता की गारंटी के लिए, आपको यह निर्धारित करना होगा कि प्रत्येक पंक्ति अद्वितीय कौन से कॉलम बनाती है। उपर्युक्त उदाहरण में, वर्ष शामिल होना चाहिए ताकि प्राथमिक कुंजी अद्वितीय हो। अर्थात

public class SalesOnEachCountry 
{   
    [Key, Column(Order=0)] public int CountryId { get; set; } 
    public string CountryName { get; set; } 
    [Key, Column(Order=1)] public int OrYear { get; set; } 

    public long SalesCount { get; set; }  
    public decimal TotalSales { get; set; } 
} 

अपने स्वयं के वस्तुओं के लिए अपनी प्राथमिक अपने प्रत्येक दृश्य के प्रमुख ऊपर विशेषताओं के समान है, इकाई की रूपरेखा को सही ढंग से मैप कर सकते हैं पंक्ति बनाना। इसलिए, इकाई फ्रेमवर्क अब आपके विचारों के समान पंक्तियों को प्रदर्शित कर सकता है।

Country  Year TotalSales 
Philippines 2010 20.000000 
Philippines 2011 40.000000 

पूर्ण यहाँ विवरण: http://www.ienablemuch.com/2011/06/mapping-class-to-database-view-with.html


फिर अपने विचारों जो किसी भी कॉलम एक पंक्ति अद्वितीय बनाने के लिए सबसे आसान तरीका है गारंटी करने के लिए इकाई की रूपरेखा आपके विचार की पंक्ति के प्रत्येक मैप कर सकते हैं की जरूरत नहीं है के बारे में अपने स्वयं के ऑब्जेक्ट्स के लिए अपने दृश्य के प्राथमिक कुंजी के लिए एक अलग कॉलम बनाना है, एक अच्छा उम्मीदवार केवल प्रत्येक पंक्ति पर पंक्ति संख्या कॉलम बनाना है। जैसे

create view RowNumberedView as 

select 
    row_number() over(order by <columns of your view sorting>) as RN 
    , * 
from your_existing_view 

फिर अपने class RowNumberedView

+0

इसके लिए धन्यवाद - आपने वास्तव में मेरी मदद की। मैं ओरेकल टेबल के साथ काम कर रहा हूं जिसमें कोई अद्वितीय आईडी कॉलम दिखाई नहीं दे रहा है और निराशाजनक शुरुआत हुई क्योंकि LINQ एक ही पंक्ति को वापस कर रहा था। मैंने एंटिटी क्लास में अपनी खुद की कुंजी बनाने के बारे में आपके सुझाव का पालन किया और यह पूरी तरह से काम करता है। – markp3rry

+1

मुझे लगता है कि प्रक्षेपण के लिए एक गाइड जोड़ना अधिक कुशल है। बाइनरी डेटा फ़ील्ड के विचारों में मैंने पाया है कि ( द्वारा ऑर्डर) क्वेरी धीमा करें। क्या इस दृष्टिकोण में कोई समस्या है?उदाहरण के लिए: चुनें NEWID() AS PrimaryKey,

+0

देखें, हालांकि, यदि आप डेटाबेस-प्रथम इकाई फ्रेमवर्क का उपयोग करते हैं तो "केवल पढ़ने वाली इकाई" सैन्स प्राथमिक कुंजी के रूप में जोड़ा गया दृश्य प्राप्त करने का एक तरीका है। जब आप एक दृश्य जोड़ते हैं तो आपको [एक साफ त्रुटि] भी मिलती है (http://stackoverflow.com/questions/24792259/error-6002-the-table-view-does-not-have-a-primary-key-defined) एक स्पष्ट कुंजी के बिना जो कहता है कि ईएफ ** ** आपकी इकाई को एक कुंजीहीन पढ़ने-योग्य इकाई होने के लिए मजबूर कर रहा है। निश्चित रूप से इसे स्वयं डुप्लिकेट करने का कोई तरीका है? – ruffin

0

क्या एक अद्वितीय पहचानकर्ता के बिना इकाई मॉडल में कोई दृश्य जोड़ना संभव है?

ऐसा विचार होना संभव है जहां एक कॉलम या प्राथमिक कुंजी बनाने वाले स्तंभों का सेट न हो; इस प्रकार, आप नकली रिश्ते के साथ खत्म हो जाते हैं। डेटा वेयरहाउस टेबल कभी-कभी उस फॉर्म का पालन करते हैं। संक्षेप में, कभी-कभी प्रदर्शन कारणों या रिपोर्टिंग कारणों के लिए सामान्यीकरण का पालन नहीं किया जाता है।

अब अपने दूसरे बात करने के लिए:

या वहां एक आसान तरीका देखने के लिए एक अनूठा पंक्ति पहचानकर्ता को जोड़ने के लिए है?

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

किक के लिए, यह चलाने की कोशिश करें और मुझे बताओ तुम्हें क्या मिलेगा:

SELECT filingmonth, 
     CEIL (filingmonth/3), 
     licnum, 
     filingyear, 
     DECODE (GROUPING (insurername), '1', '- All Insured -', insurername), 
     insurername, 
     policylinecode, 
     linedescription, 
     SUM (NVL (grosspremium, 0)), 
     SUM (DECODE (taxexempt, 1, grosspremium, 0)), 
     TRUNC (
      CASE 
       WHEN (b.rsn IS NOT NULL OR a.zeroreport = 1) 
        AND b.datereceived IS NULL 
       THEN 
        a.datereceived 
       ELSE 
        b.datereceived 
      END), 
     SUM (aip.iscompanyadmitted (b.naiccocode, b.naicalienid)), 
     a.insuredid 
    FROM aip.slbtransinsured a 
     LEFT OUTER JOIN aip.slbtransinsurer b 
      ON a.insuredid = b.insuredid 
     LEFT OUTER JOIN aip.slblinecodes c 
      ON b.policylinecode = c.linecode 
WHERE a.submitted = 1 AND a.entryincomplete = 0 
GROUP BY filingmonth, 
     licnum, 
     filingyear, 
     DECODE (GROUPING (insurername), '1', '- All Insured -', insurername), 
     insurername, 
     policylinecode, 
     linedescription, 
     TRUNC (
      CASE 
       WHEN (b.rsn IS NOT NULL OR a.zeroreport = 1) 
         AND b.datereceived IS NULL 
       THEN 
        a.datereceived 
       ELSE 
        b.datereceived 
      END), 
     a.insuredid; 
+0

धन्यवाद, यह ग्रुप बाय क्लॉज में ग्रुपिंग फ़ंक्शन पसंद नहीं करता है। Slbtransinsured में एकमात्र अद्वितीय कॉलम इसकी प्राथमिक कुंजी है, बीमाकृत, जिसे दृश्य में डुप्लिकेट किया गया है। Slbtransinsured और slblinecodes के बीच कोई संबंध नहीं है, केवल slbtransinsurer और slblinecodes के बीच। –

0

एक पंक्ति काउंटर क्षेत्र के आर एन संपत्ति पर [Key] विशेषता आवंटित कुंजी के रूप में उपयोग करने के लिए दृश्य में जोड़ा जा सकता है।

कृपया link देखें।

12

माइकल बुआ से उत्तर पर विस्तार: मैंने पाया कि एक ISNULL() के साथ दृश्य संख्या पंक्ति जोड़ना इकाई फ्रेमवर्क को दृश्य को खींचने और आवश्यक एंटीटीसेट डेटा स्वचालित रूप से बनाने की अनुमति देगा।

create view RowNumberedView as 

select 
    ISNULL(ROW_NUMBER() OVER (ORDER BY <column>), 0) AS RN 
    , * 
from your_existing_view 
+0

यह मेरे लिए कोई काम नहीं है, मैंने पहले से ही एक पंक्ति_नंबर डाला है, लेकिन मैं अभी भी अपनी EntitySet में दृश्य पुनर्प्राप्त किए बिना हूं – csuazo