2008-08-18 8 views
9

मैपिंग में इंटरफ़ेस और अपवाद लागू करती है, मैं LINQ के साथ रिपोजिटरी पैटर्न का उपयोग कर रहा हूं, इसमें IRepository.DeleteOnSubmit (T Entity) है। यह ठीक काम करता है, लेकिन जब मेरी इकाई वर्ग इंटरफेस, इस तरह है:LINQ, इकाई जो

IEntity ie=repository.GetByID(1); 
repoitory.DeleteOnSubmit(ie); 

फेंकता
सदस्य 'IEntity.ID' है:

public interface IEntity { int ID {get;set;} } 

public partial class MyEntity: IEntity { 

    public int ID { 
     get { return this.IDfield; } 
     set { this.IDfield=value; } 
    } 
} 

और उसके बाद इस तरह की कुछ इकाई को हटाने का प्रयास एसक्यूएल में कोई समर्थित अनुवाद नहीं।

डीबी कार्यों से डेटा लाने, लेकिन हटाएं और डालें नहीं। DataContext के खिलाफ इंटरफ़ेस का उपयोग कैसे करें?


संदेश यह है:
अपवाद संदेश: सदस्य 'MMRI.DAL.ITag.idContent' एसक्यूएल के लिए कोई समर्थित अनुवाद है।

कोड:

var d = repContent.GetAll().Where(x => x.idContent.Equals(idContent)); 
foreach (var tagConnect in d) <- error line 
{ 
    repContet.DeleteOnSubmit(tagConnect); 

(यह डीबी से सभी टैग हो जाता है, और उन्हें हटा देता है)

और स्टैक ट्रेस: ​​

[NotSupportedException: The member 'MMRI.DAL.ITag.idContent' has no supported translation to SQL.] 
    System.Data.Linq.SqlClient.Visitor.VisitMember(SqlMember m) +621763 
    System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) +541 
    System.Data.Linq.SqlClient.SqlVisitor.VisitExpression(SqlExpression exp) +8 
    System.Data.Linq.SqlClient.SqlVisitor.VisitBinaryOperator(SqlBinary bo) +18 
    System.Data.Linq.SqlClient.Visitor.VisitBinaryOperator(SqlBinary bo) +18 
    System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) +196 
    System.Data.Linq.SqlClient.SqlVisitor.VisitExpression(SqlExpression exp) +8 
    System.Data.Linq.SqlClient.SqlVisitor.VisitSelectCore(SqlSelect select) +46 
    System.Data.Linq.SqlClient.Visitor.VisitSelect(SqlSelect select) +20 
    System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) +1024 
    System.Data.Linq.SqlClient.SqlProvider.BuildQuery(... 

जब मैं आंशिक वर्ग को सजाने कर प्रयास करें:

[Column(Storage = "_idEvent", DbType = "Int NOT NULL", IsPrimaryKey = true)] 
public int idContent 
{ get { return this.idEvent; } set { this.idEvent=value; } } 

त्रुटि फेंकता है "अमान्य कॉलम नाम 'idContent'।"

+2

स्टैक ओवरफ़्लो एक मंच नहीं है। प्रश्न में "उत्तर" के रूप में पोस्ट की गई कुछ चीज़ें (और अन्य) वास्तव में "टिप्पणियां" होनी चाहिए। आप मूल प्रश्न और कोई जवाब भी संपादित कर सकते हैं। – jeroenh

उत्तर

0

इस प्रयास करें:

using System.Data.Linq.Mapping; 

public partial class MyEntity: IEntity 
{ [Column(Storage="IDfield", DbType="int not null", IsPrimaryKey=true)] 
     public int ID 
     {   
      get { return this.IDfield; }   
      set { this.IDfield=value; }  
     } 
} 
3

यह मेरे लिए काम करता है -

public partial class MyEntity: IEntity 
{ [Column(Name = "IDfield", Storage = "_IDfield", IsDbGenerated = true)] 
     public int ID 
     {   
      get { return this.IDfield; }   
      set { this.IDfield=value; }  
     } 
} 
+1

दुर्भाग्य से ऊपर कर के साथ समस्याओं कर रहे हैं - http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/5691e0ad-ad67-47ea-ae2c-9432e4e4bd46 वहाँ एक करने के लिए एक लिंक भी है उस पृष्ठ के निचले हिस्से में एमएस कनेक्ट पर लॉग इन बग। उम्मीद है कि आप में से कुछ इसे वोट दे सकते हैं ताकि इसे देखा जा सके - यह एक मुद्दा है जो मुझे थोड़ी देर के लिए परेशान कर रहा है ... –

0

वास्तविक एसक्यूएल करने के लिए अपने LINQ क्वेरी का अनुवाद के लिए, Linq2SQL अभिव्यक्ति आप इसे देने के निरीक्षण करता है। समस्या यह है कि आपने "आईडी" संपत्ति को वास्तविक डीबी कॉलम नाम में अनुवाद करने में सक्षम होने के लिए एल 2 एस के लिए पर्याप्त जानकारी प्रदान नहीं की है। आप यह सुनिश्चित करके प्राप्त कर सकते हैं कि L2S "आईडी" को "आईडीफ़ील्ड" में मैप कर सकता है।

उत्तर में दिए गए दृष्टिकोण का उपयोग करके यह संभव होना चाहिए।

यदि आप डिज़ाइनर का उपयोग करते हैं, तो आप क्लास प्रॉपर्टी "आईडीफ़ील्ड" को "आईडी" में भी नामित कर सकते हैं, अतिरिक्त लाभ के साथ कि आपको अपने आंशिक वर्ग में "आईडी" संपत्ति को स्पष्ट रूप से लागू नहीं करना होगा, यानी MyEntity के लिए आंशिक वर्ग परिभाषा बस हो जाता है:

public partial class MyEntity: IEntity 
{  
} 
7

ऐसा प्रतीत होता है जब LINQ करने वाली एसक्यूएल MVC4 में उपयोग करते हुए माइक्रोसॉफ्ट इंटरफेस में == ऑपरेटर का समर्थन समाप्त कर (या शायद यह समर्थित कभी नहीं गया था)। हालांकि आप == ऑपरेटर के स्थान पर i.ID.Equals(someId) का उपयोग कर सकते हैं।

कास्टिंग IQueryable से IEnumerable काम करता है लेकिन का उपयोग नहीं किया जाना चाहिए! कारण यह है: IQueryable में IEnumerable का मज़ाकिया कार्यान्वयन है।IEnumerable इंटरफ़ेस के माध्यम से IQueryable पर जो भी linq विधि आप उपयोग करेंगे, पहले क्वेरी को निष्पादित करने का कारण बन जाएगा, सभी परिणामों को डीबी से स्मृति में लाया गया है और अंततः डेटा पर विधि localy चला रहा है (आमतौर पर उन तरीकों का अनुवाद किया जाएगा एसक्यूएल और डीबी में निष्पादित)। कल्पना करें कि अरब पंक्तियों वाली एक तालिका से एक पंक्ति प्राप्त करने की कोशिश कर रहे हैं, उनमें से सभी को केवल एक चुनने के लिए लाया जा रहा है (और यह IQueryable से IEnumerable और आलसी लोडिंग से संबंधित डेटा के लापरवाह कास्टिंग के साथ बहुत खराब हो जाता है)।

स्पष्ट रूप से लिंक को स्थानीय डेटा पर इंटरफेस के साथ == ऑपरेटर का उपयोग करने में कोई समस्या नहीं है (इसलिए केवल IQueryable प्रभावित है) और एंटीटी फ्रेमवर्क (या इसलिए मैंने सुना) के साथ भी।

+0

यह वास्तव में अजीब है कि '==' समर्थित नहीं है। वैसे भी, उत्तर 'i.ID.Equals (someId) के लिए धन्यवाद' मेरे लिए ठीक काम करता है। – mykhailovskyi

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